2011-11-13 10 views
10

Pytanie jest naprawdę proste. Co to jest Request.InputStream i kiedy go używać. Czy zawsze jest używany do odczytu całego treści html wysłanej w zapytaniu pocztowym lub tylko niektórych parametrów wysłanych w nim? Dlaczego nie powinienem wysyłać danych jako parametru do mojego kodu po stronie serwera, przekazując go w żądaniu Ajax?co to jest Request.InputStream i kiedy go użyć?

W przykładzie mogę albo przekazać parametr w data: lub mogę odczytać parametr w Request.InputStream. Kiedy powinienem użyć którego?

Przykład:

W sterowniku:

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

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

Odpowiedz

8

Request.InputStream umożliwia dostęp do surowych danych żądania. Jeśli dane są sformatowane przy użyciu standardowego formatu, takiego jak application/x-www-form-urlencoded lub multipart/form-data lub innego formatu zrozumiałego dla domyślnego spoiwa modelu, nie trzeba używać Request.InputStream. Program ASP.NET przeanalizuje wartości żądań i będzie można uzyskać do nich bezpośredni dostęp za pomocą Request[...]. Oczywiście w ASP.NET MVC nie trzeba nawet używać Request[...], ponieważ można zdefiniować model widoku, który kontroler podejmie jako parametr i pozostawić spinaczowi modelu przypisanie jego właściwości z żądania.

Istnieją jednak przypadki, w których można uzyskać dostęp do nieprzetworzonego strumienia żądań. Na przykład wymyśliłeś niestandardowy protokół i klient wysyła niestandardowe sformatowane dane do strumienia żądania. Te przypadki są bardzo rzadkie, ponieważ wymyślanie niestandardowych protokołów nie jest powszechne.

Wróć do pytania. W twoim przypadku można zdefiniować model wyświetlania:

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

który swoją działanie kontroler przyjmie jako argumentu:

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

i na kliencie Polecam Ci stosując metodę JSON.stringify który natywnie wbudowany nowoczesne przeglądarki do JSON serializują literał javascript żądania w łańcuchu JSON zamiast ręcznie pisać JSON tak jak ty:

$.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); 
    } 
}); 
Powiązane problemy