2013-09-04 15 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; 
    } 
} 

Gelen istekleri günlüğe kaydetmek için bunu ActionFilters'tan çağırmayı planlıyorum. Tabi ki birden fazla eşzamanlı istek olabilir.Bu, bir HttpContext isteğinin gövdesini almanın güvenli bir yolu mu?

Bu yaklaşım iyi mi?

cevap

5

Sorunuz, genel olarak eşzamanlılık veya ASP.NET Web API'sinin perspektifinden mi geliyor? Her isteğin kendi bağlamı vardır ve paralel olarak devam eden birden fazla istekle birlikte iyisiniz. Ama bakman gereken iki şey var.

(1) HttpContext kullanıyor olduğunuzdan, kendinizi birçok durumda iyi olması gereken web barındırma (IIS) için kilitliyorsunuz. Ama bunun farkında olmanızı isterim.

(2) Kodunuz HttpRequestHelper.RequestBody(), belirtmiş olduğunuz gibi bir eylem filtresinden çağrıldığında çalışacaktır. Ancak, bunu başka yerlerden çağırmaya çalışırsanız, bir ileti işleyici söyleyin, bu işe yaramaz. Bunun işe yaramayacağını söylediğimde, istek gövdesini eylem yöntemi parametresine bağlayan parametre bağlaması çalışmaz. İşiniz bittiğinde başlangıç ​​için aramanız gerekecek. İşlem filtresinden çalışmasının nedeni, bağlantı filtresinin boru hattında çalıştığı zamana kadar olan bağlantının zaten gerçekleşmiş olmasıdır. Bu bilmeniz gereken başka bir şey.

+0

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

+0

Re (1) bunu belirtdiğiniz için teşekkür ederim; Öngörülebilir bir gelecekte IIS’ye ev sahipliği yapacağım. – tom

+0

Evet, daha güvenli tarafta olmanın başlangıcını arayabilirsiniz. – Badri

0

Http İsteği'nin InputStream uygulamasını kullanmam gerekiyor. Ben bir aspx sayfasına giden bir WebApp ve IOS App var, url isteği veritabanında bilgileri okudum bazı parametreler içeriyorsa ve url isteğinde herhangi bir parametre bulamıyorsam istek gövdesini okuyor ve iyi çalışıyoruz!

 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) 

        { 
    ....