web-dev-qa-db-fra.com

"Stream envoie un événement avant d'être ouvert"

J'essaie de faire une demande SOAP avec Swift. Exécution du dernier Xcode/iOS à partir du 9/9/14. J'utilise une NSMutableURLRequest à laquelle j'ajoute un HTTPBody avec les informations de demande. Cependant, une fois que je lance une NSURLConnection avec la demande, le message d'erreur "Le flux xxxxxxxxx envoie un événement avant d'être ouvert". Je n'utilise aucune bibliothèque de réseau, juste une vieille NSURLConnection. Des idées sur ce qui pourrait causer cette erreur? Merci!

Code pertinent utilisé:

func createSOAPRequestWithEnvelope(soapEnvelope : String) {
    //create request
    var url = NSURL(string: "https://my-service-url")
    var req = NSMutableURLRequest(URL: url, cachePolicy: NSURLRequestCachePolicy.UseProtocolCachePolicy, timeoutInterval: 5000)

    req.addValue("text/xml",    forHTTPHeaderField: "Content-Type")
    req.HTTPMethod = "POST"
    req.HTTPBody = soapEnvelope.dataUsingEncoding(NSUTF8StringEncoding)

    //begin connection
    var connection = NSURLConnection(request: req, delegate: self, startImmediately: false)
    connection.scheduleInRunLoop(NSRunLoop.mainRunLoop(), forMode: NSDefaultRunLoopMode)

    connection.start() //error happens after this command :(
}

//takes care of NTLM Authentication
func connection(connection: NSURLConnection!, didReceiveAuthenticationChallenge challenge: NSURLAuthenticationChallenge!) {
    var authMethod = challenge.protectionSpace.authenticationMethod

    if authMethod == NSURLAuthenticationMethodNTLM {
        var credential = NSURLCredential(user: self.username,
            password: self.password,
            persistence: NSURLCredentialPersistence.ForSession)

        challenge.sender.useCredential(credential, forAuthenticationChallenge: challenge)
    }
}

func connection(connection: NSURLConnection!, didReceiveResponse response: NSURLResponse!) {
    // Response received, clear out data
    self.transactionData = NSMutableData()
}

func connection(connection: NSURLConnection!, didReceiveData data: NSData!) {
    // Store received data
    self.transactionData?.appendData(data)
}
22
Ruben Martinez Jr.

Le problème avec Stream not Open semble être directement lié à la mise en œuvre de CFNetwork. (reproductible avec NSConnection et aussi NSSession). Cela se produit pour les demandes (réponses) qui doivent être fragmentées. Un effet secondaire de ce problème est que l’authentification Windows ne fonctionne pas correctement et que chaque demande doit passer par un processus de négociation complet. Et ce n'est pas corrigé également dans iOS 8.1. 

4
Balki

J'ai cherché partout ce problème et je finissais par passer les informations d'identification erronées à didReceiveAuthenticationChallenge :(

Vérifiez si vous faites la même chose accidentellement

Si cela ne fonctionne pas, essayez ceci:

Intégrez vos informations d'identification dans la chaîne d'URL

NSString *urlString = @"http://username:[email protected]/home";
[webview loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:urlString]]];
0
MobileMon