2011-11-13 45 views
10

La domanda è davvero semplice. Che cos'è Request.InputStream e quando usarlo. Viene sempre utilizzato per leggere l'intero corpo html inviato nella richiesta o solo alcuni parametri inviati in esso? Perché non dovrei inviare dati come parametro al mio codice lato server passandolo nella richiesta Ajax?Cos'è Request.InputStream e quando usarlo?

Nell'esempio è possibile passare il parametro nello data: oppure è possibile leggere il parametro nello Request.InputStream. Quando dovrei usare quale?

Esempio:

In regolatore:

public ActionResult GetSomeData(string someData) 
    { 
     Request.InputStream.Position = 0; 
     System.IO.StreamReader str = new System.IO.StreamReader(Request.InputStream); 
     string sBuf = str.ReadToEnd(); 
     return Json("something"); 
    } 

Ajax Richiesta:

 $.ajax({ 
      type: "POST", 
      url: "Home/GetSomeData", 
      data: "{someData:'Hello'}", 
      contentType: "application/json; charset=utf-8", 
      dataType: "json", 
      success: function (msg) { 
       alert(msg); 
       // Insert the returned HTML into the <div>. 
       $('#dvResult').html(msg); 
      } 
     }); 

risposta

8

Request.InputStream permette di accedere ai dati di richiesta grezzi. Se questi dati sono formattati utilizzando un formato standard come application/x-www-form-urlencoded o multipart/form-data o un altro formato che il raccoglitore modello predefinito comprende, non è necessario utilizzare Request.InputStream. ASP.NET analizzerà i valori della richiesta e sarà possibile accedervi direttamente utilizzando Request[...]. Naturalmente in ASP.NET MVC non è nemmeno necessario utilizzare Request[...] perché è possibile definire un modello di vista che l'azione del controllore avrà come parametro e lasciare che il raccoglitore modelli assegni le sue proprietà dalla richiesta.

In alcuni casi, tuttavia, è possibile accedere al flusso di richieste non elaborato. Ad esempio, hai inventato un protocollo personalizzato e il client invia alcuni dati formattati personalizzati nel flusso della richiesta. Questi casi sono molto rari da quando l'invenzione di protocolli personalizzati non è molto comune.

Ora torna alla tua domanda. Nel tuo caso è possibile definire un modello di vista:

public class MyViewModel 
{ 
    public string SomeData { get; set; } 
} 

che la vostra azione di controllo avrà come argomento:

public ActionResult GetSomeData(MyViewModel model) 
{ 
    // model.SomeData will contain the Hello string that the client sent 
    return Json("something"); 
} 

e sul client ti consiglierei di utilizzare il metodo JSON.stringify che è nativamente integrato in i moderni browser di JSON serializzano la richiesta javascript letteral in una stringa JSON invece di scrivere manualmente il JSON come hai fatto:

$.ajax({ 
    type: 'POST', 
    url: 'Home/GetSomeData', 
    data: JSON.stringify({ someData: 'Hello' }), 
    contentType: 'application/json; charset=utf-8', 
    success: function (msg) { 
     alert(msg); 
     // Insert the returned HTML into the <div>. 
     $('#dvResult').html(msg); 
    } 
});