2011-11-13 43 views
10

La pregunta es realmente simple. ¿Qué es Request.InputStream y cuándo usarlo? ¿Se usa siempre para leer todo el cuerpo html enviado en la solicitud posterior o solo algunos parámetros enviados en él? ¿Por qué no debería enviar datos como parámetro a mi código del lado del servidor al pasarlo en la solicitud de Ajax?¿Qué es Request.InputStream y cuándo usarlo?

En el ejemplo, puedo pasar el parámetro en el data: o puedo leer el parámetro en el Request.InputStream. ¿Cuándo debería usar cuál?

Ejemplo:

En el regulador:

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 Solicitud:

 $.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); 
      } 
     }); 

Respuesta

8

Request.InputStream le permite acceder a los datos de la solicitud primas. Si estos datos se formatean utilizando algún formato estándar como application/x-www-form-urlencoded o multipart/form-data o algún otro formato que el encuadernador de modelos predeterminado entienda, no es necesario que use Request.InputStream. ASP.NET analizará los valores de solicitud y podrá acceder a ellos directamente utilizando Request[...]. Por supuesto, en ASP.NET MVC ni siquiera necesita usar Request[...] porque puede definir un modelo de vista que su acción de controlador tomará como parámetro y dejará que el enlazador de modelos asigne sus propiedades desde la solicitud.

Existen casos en los que es posible que desee acceder a la secuencia de solicitud sin procesar. Por ejemplo, ha inventado algún protocolo personalizado y el cliente envía algunos datos formateados personalizados en la secuencia de solicitud. Esos casos son muy raros ya que inventar protocolos personalizados no es muy común.

Ahora volvamos a su pregunta. En su caso se podría definir una vista de modelo:

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

cual su acción del controlador tomará como argumento:

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

y en el cliente le recomiendo que utilizando el método JSON.stringify que se forma nativa integrada en Los navegadores modernos de JSON serializan el literal de solicitud de JavaScript en una cadena JSON en lugar de escribir el JSON manualmente como lo hizo:

$.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); 
    } 
}); 
Cuestiones relacionadas