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; 
    } 
} 

Ho intenzione di chiamare questo da ActionFilters per registrare le richieste in arrivo. Naturalmente potrebbero esserci più richieste simultanee.È un modo sicuro per ottenere il corpo di una richiesta HttpContext

Questo approccio è corretto?

risposta

5

La domanda è dal punto di vista della concorrenza o dell'API Web ASP.NET in generale? Ogni richiesta ha il suo contesto e tu stai bene con più richieste in corso in parallelo. Ma qui ci sono due cose da guardare.

(1) Poiché si utilizza HttpContext, ci si sta bloccando su Web hosting (IIS), che in molti casi dovrebbe essere corretto. Ma vorrei che te ne rendessi conto.

(2) Il codice HttpRequestHelper.RequestBody() funzionerà quando viene chiamato da un filtro azione, come indicato. Tuttavia, se provi a chiamare questo da altri posti, ad esempio un gestore di messaggi, questo non funzionerà. Quando dico che questo non funzionerà, il collegamento dei parametri che lega il corpo della richiesta al parametro del metodo action non funzionerà. Avrai bisogno di cercare l'inizio una volta che hai finito. La ragione per cui funziona dal filtro azione è che l'associazione sarebbe già avvenuta nel momento in cui il filtro azione viene eseguito nella pipeline. Questa è un'altra cosa di cui potresti aver bisogno.

+0

Re. (2) devo aggiungere bodyStream.BaseStream.Seek (0, SeekOrigin.Begin); after var bodyText = bodyStream.ReadToEnd(); ? – tom

+0

Ri. (1) grazie per averlo indicato; Sarò su IIS per il prossimo futuro. – tom

+0

Sì, puoi cercare all'inizio di essere sul lato più sicuro. – Badri

0

Ho bisogno di utilizzare InputStream di Http Request. Ho una app WebApp e IOS che naviga verso una pagina aspx, se la richiesta url contiene alcuni parametri leggo le informazioni nel database e se non trovo alcun parametro nella richiesta url ho letto il corpo della richiesta e lavoro bene!

 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) 

        { 
    ....