2013-09-04 11 views
9
public static class HttpRequestHelper 
{ 
    public static string RequestBody() 
    { 
     var bodyStream = new StreamReader(HttpContext.Current.Request.InputStream); 
     bodyStream.BaseStream.Seek(0, SeekOrigin.Begin); 
     var bodyText = bodyStream.ReadToEnd(); 
     return bodyText; 
    } 
} 

Mam zamiar wywołać to z ActionFilters w celu rejestrowania przychodzących żądań. Oczywiście może być wiele jednoczesnych żądań.Czy jest to bezpieczny sposób uzyskania treści żądania HttpContext

Czy to podejście jest w porządku?

Odpowiedz

5

Czy Twoje pytanie jest z perspektywy współbieżności lub ASP.NET Web API w ogóle? Każde żądanie ma swój własny kontekst i nie przeszkadza ci równoległe wykonywanie wielu żądań. Ale tutaj są dwie rzeczy do zobaczenia.

(1) Ponieważ używasz HttpContext, zamykasz się na hosting (IIS), co w wielu przypadkach powinno być w porządku. Ale chciałbym, żebyś był tego świadomy.

(2) Twój kod HttpRequestHelper.RequestBody() zadziała po wywołaniu z filtra akcji, o czym już wspomniałeś. Jeśli jednak spróbujesz wywołać to z innych miejsc, powiedz handlerowi wiadomości, to nie zadziała. Kiedy mówię, że to nie zadziała, powiązanie parametrów wiążące parametr żądania treści do działania nie będzie działać. Będziesz musiał zacząć od początku, gdy skończysz. Powodem, dla którego działa z filtru działań, jest to, że wiązanie miało już miejsce w filtrze działania czasu w potoku. Jest to kolejna rzecz, o której być może musisz pamiętać.

+0

Re. (2) należy dodać bodyStream.BaseStream.Seek (0, SeekOrigin.Begin); after var bodyText = bodyStream.ReadToEnd(); ? – tom

+0

Re. (1) dziękuję za wskazanie tego; Będę hostować na IIS w najbliższej przyszłości. – tom

+0

Tak, możesz zacząć od początku, aby być bezpieczniejszym. – Badri

0

Potrzebowałem użyć InputStream z żądania HTTP. Mam aplikację WebApp i IOS, która nawiguje do strony aspx, jeśli żądanie url zawiera pewne parametry, czytam informacje w bazie danych i jeśli nie znajdę żadnych parametrów w żądaniu adresu URL, odczytuję treść żądania i działam dobrze!

 protected void Page_Load(object sender, EventArgs e) 
     { 
      try 
      { 
       if (string.IsNullOrEmpty(Request.QueryString["AdHoc"]) == false) 
       { 



         string v_AdHocParam = Request.QueryString["AdHoc"]; 
         string [] v_ListParam = v_AdHocParam.Split(new char[] {','}); 

         if (v_ListParam.Length < 2) 
     { 


        DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(WS_DemandeIntervention)); 
        WS_DemandeIntervention response = (WS_DemandeIntervention)jsonSerializer.ReadObject(Request.InputStream); 
.... 
} 


    if (string.IsNullOrEmpty(Request.QueryString["IdBonDeCommande"])==false) 

        { 
    .... 
Powiązane problemy