2011-06-16 5 views
4

Je suis en train d'essayer de comprendre pourquoi la même ligne retourne le corps de la requête comme une chaîne dans Post() et une chaîne vide dans Put() et finalement comment obtenir le corps de la requête Mettre().Lecture du corps de la requête PUT

[HttpPost] 
public JsonResult Post() 
{ 
    ... 
    var todoJson = new StreamReader(Request.InputStream).ReadToEnd(); 
    ... 
} 

[HttpPut] 
public JsonResult Put(int id) 
{ 
    ... 
    var todoJson = new StreamReader(Request.InputStream).ReadToEnd(); 
    ... 

} 

Basé sur ((System.Web.HttpInputStream)(Request.InputStream))._data._data i got Put(), les valeurs d'octet sont dans le corps de la demande, mais je suis à défaut d'extraire le contenu. Toute aide grandement appréciée.

Editer: La méthode de HttpRequest.InputStream documentation fonctionne dans Post(), dans Put() il renvoie une chaîne "\ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 ... "de Content-Length.

Répondre

10

Je l'ai vu ce Request.InputStream.Position plus tôt des points à la fin de la demande corps, donc

Request.InputStream.Position = 0; 

résout le problème.

0

C'est probablement parce que HTTP Put n'est pas largement supporté par les navigateurs, comme mentionné dans le message SO: Doing a HTTP PUT from a browser. Vous êtes probablement mieux coller à GET et POST pour la compatibilité la plus large. Cependant, je l'ai entendu parler de code qui peut utiliser une HttpWebRequest brute pour effectuer une vente, comme outlined here par Jason DeFontes dans ce post:

 string json = "..."; 
     byte[] arr = System.Text.Encoding.UTF8.GetBytes(xml); 
     HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://localhost/"); 
     request.Method = "PUT"; 
     request.ContentType = "application/json"; 
     request.ContentLength = arr.Length; 
     Stream dataStream = request.GetRequestStream(); 
     dataStream.Write(arr, 0, arr.Length); 
     dataStream.Close(); 
     HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
     string returnString = response.StatusCode.ToString(); 
     Console.WriteLine(returnString); 
+0

Merci, c'est une bonne lecture. J'ai vu ce code et la chose est le navigateur envoie PUT. Pour être plus clair, je suis en train de faire un gestionnaire RESTful pour l'application backbone.js [todo] (http://documentcloud.github.com/backbone/examples/todos/index.html), donc tous les GET, POST, Les requêtes PUT, DELETE sont envoyées par backbone et fonctionnent pour la [même application] (https://github.com/ccarpenterg/todolist/wiki) écrite pour Google App Engine. Donc, il semble que le corps de la requête est là, je ne peux pas le lire. –

Questions connexes