2010-09-02 15 views
1

Je construis une application iPhone pour extraire un fichier d'un serveur IIS7. J'utilise un simple NSURLRequest pour récupérer ce fichier. La demande fonctionne bien si j'utilise un autre serveur web, mais pour une raison quelconque, celui-ci continue à me donner une mauvaise demande de 400. J'ai donc pris un coup d'œil à la demande du NSURLRequest envoie, et il ressemble à ceci:NSURLRequest Bad Request (400) à IIS Server

::1 [Wed Sep 01 20:18:53 -0400 2010]: GET /some.file 
::1 [Wed Sep 01 20:18:53 -0400 2010]: HTTP/1.1 
::1 [Wed Sep 01 20:18:53 -0400 2010]: Host: localhost 
::1 [Wed Sep 01 20:18:53 -0400 2010]: User-Agent: MyApp/1.0 CFNetwork/485.2 Darwin/10.4.0 
::1 [Wed Sep 01 20:18:53 -0400 2010]: Accept: */* 
::1 [Wed Sep 01 20:18:53 -0400 2010]: Accept-Language: en-us 
::1 [Wed Sep 01 20:18:53 -0400 2010]: Accept-Encoding: gzip, deflate 
::1 [Wed Sep 01 20:18:53 -0400 2010]: Connection: keep-alive 
::1 [Wed Sep 01 20:18:53 -0400 2010]: 

je telnet et connecté directement au serveur Web. Envoyé le suivant:

GET /some.file HTTP/1.1\r\n 

Cela a bien fonctionné, le serveur a répondu avec le fichier. J'ai l'impression que le fait que NSURLRequest mette HTTP/1.1 sur une autre ligne fait que IIS7 renvoie une requête incorrecte.

Quelqu'un sait comment je peux remédier à cette situation? Cela ne me dérange pas de faire des changements sur le serveur ou le client, mais malheureusement, je suis coincé avec IIS.

Merci

Répondre

1

figured it out ... mon URL avait un \ n à la fin. Pas étonnant que NSURLRequest ait placé HTTP/1.1 sur une autre ligne. Je suis surpris que NSURL ne nettoie pas la chaîne. sensationnel.

0

J'ai eu une configuration similaire (non IIS, cependant): GET demande, échoue avec HTTP 400 sur iOS/code Swift (NSURLSession), mais fonctionne sur Postman et boucle.

Après des heures et des heures d'essayer de comprendre ce qui pourrait être différent entre les demandes envoyées par chaque client, j'ai découvert mon code iOS envoyait un dictionnaire rapide vide (de type [String : Any]) codé comme JSON dans la demande corps.

J'ai conçu mon code client pour prendre un dictionnaire non optionnel comme paramètres de la requête, et l'encoder/l'ajouter au corps de la requête quel que soit son contenu. Certaines requêtes (comme celle que j'essayais) ne nécessitent aucun paramètre dans le corps, et d'une façon ou d'une autre la dictée vide causait des problèmes. Le supprimer a fixé la connexion.

(Je vais maintenant factoriser ma fonction de prendre une place facultative dictionnaire comme argument, et passer nil pour les demandes qui prennent aucun paramètre dans le corps.)

Pas une solution à la question de l'OP peut-être, mais lié. Voici juste au cas où cela aiderait quelqu'un à éviter les heures perdues de misère ...