2012-08-02 3 views
4

Mon scénario: J'utilise MonoTouch pour iOS pour créer une application iPhone. J'appelle les services HTTP ASP.NEt MVC 4 Web API pour me connecter/me déconnecter. Pour la connexion, j'utilise le webmethod POST et tout va bien. Pour la déconnexion, j'appelle la méthode Web Delete. Je souhaite transmettre des données JSON (données complexes sérialisées) à l'appel Delete. Si je transmets des données simples comme un paramètre de chaîne unique dans le cadre de l'URL elle-même, alors tout est bien, c'est-à-dire que Delete fonctionne! Afin de passer le Json complexe de données, voici mon appel (j'ai ajusté le code pour le rendre simple en montrant un seul paramètre - UserName envoyé via JSON):MonoTouch/iPhone - Appel à HttpWebRequest.GetRequestStream() se connecte au serveur lorsque la méthode HTTP est SUPPRIMER

HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create("http://localhost/module/api/session/"); 
     req.ContentType = "application/json"; 
     req.CookieContainer = jar; 
     req.Method = "Delete"; 
     using (var streamWrite = new StreamWriter(req.GetRequestStream())) 
     { 
      string jSON = "{\"UserName\":\"" + "someone" + "\"}"; 
      streamWrite.Write(jSON); 
      streamWrite.Close(); 
     } 
     HttpWebResponse res = (HttpWebResponse)req.GetResponse(); 

sur le serveur, la méthode Delete semble a cette définition:

public void Delete(Credentials user) 

où Credentials est un type complexe.

Maintenant, voici le problème!

Le code ci-dessus, pénètre dans la méthode Delete sur le serveur dès qu'il frappe:

req.GetRequestStream() 

Et par conséquent, le paramètre envoyé à la méthode Delete finit par être nul

Et voici la partie bizarre: Si j'utilise exactement le même code en utilisant une application de test VS 2010 windows, même le code ci-dessus fonctionne ... c'est-à-dire qu'il n'appelle pas Delete jusqu'à ce que req.GetResponse() soit appelé! Et dans ce scénario, le paramètre de la méthode Delete est un objet valide!

QUESTION

Toutes les idées ou est-ce un bug avec MonoTouch, le cas échéant, une solution de contournement?

REMARQUE:

si je change la définition Supprimer pour public void Supprimer (string userName) et au lieu de JSON, si je passe le paramètre dans le cadre de l'URL elle-même, tout est bien. Mais comme je l'ai dit, ce n'est qu'un exemple simplifié pour illustrer mon problème. Toute aide est appréciée !!!

Répondre

2

Cela semble être mal défini. Voir cette question pour plus de détails: Is an entity body allowed for an HTTP DELETE request?

En général MonoTouch (basé sur Mono) essayera d'être fonctionnalité/bogue compatible avec le framework Microsoft .NET pour faciliter la portabilité du code entre les plates-formes. IOW si MS.NET ignore le corps d'une méthode DELETE, il en sera de même pour MonoTouch.

Si le comportement diffère alors un rapport de bogue doit être rempli à http://bugzilla.xamarin.com

+0

Salut poupou, Merci pour votre réponse. J'ai passé en revue le lien - alors que les premiers commentaires suggèrent que le corps est ignoré, il y a un commentaire plus récent qui dit que c'est autorisé. Quoi qu'il en soit, comme je l'ai mentionné dans mon message d'origine, le même code fonctionne dans une application Windows Forms Visual Studio 2010, c'est-à-dire qu'il n'ignore pas les données json supplémentaires envoyées. On dirait que je devrais déposer un rapport sur bugzilla. Faites-moi savoir si vous pensez autrement sinon je le ferai. –

+0

Terminé. Déposé un rapport sur bugzilla. Merci poupou !!! –

+0

@AMSIDev Pourriez-vous poster l'URL du rapport bugzilla? Merci beaucoup! –

Questions connexes