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

들어오는 요청을 기록하려면 ActionFilters에서 호출 할 계획입니다. 물론 여러 개의 동시 요청이있을 수 있습니다.HttpContext 요청의 본문을 가져 오는 안전한 방법입니까?

이 접근 방법은 괜찮습니까?

답변

5

동시성 또는 ASP.NET 웹 API의 관점에서 질문 하시겠습니까? 모든 요청에는 자체 컨텍스트가 있으며 여러 요청을 동시에 처리 할 수 ​​있습니다. 그러나 여기 당신이 볼 두 가지가 있습니다.

(1) HttpContext을 사용하고 있으므로 웹 호스팅 (IIS)에 잠겨 있습니다. 대부분의 경우 괜찮습니다. 하지만이 사실을 알고 싶습니다.

(2) 귀하의 코드 HttpRequestHelper.RequestBody()은 언급 한대로 작업 필터에서 호출 할 때 작동합니다. 그러나 이것을 다른 장소, 즉 메시지 처리기에서 호출하려고 시도하면 작동하지 않습니다. 이것이 작동하지 않는다고 말하면 요청 본문을 작업 메서드 매개 변수에 바인딩하는 매개 변수 바인딩이 작동하지 않습니다. 일단 끝나면 처음에 찾아야합니다. 액션 필터에서 작동하는 이유는 액션 필터가 파이프 라인에서 실행될 때까지 바인딩이 이미 발생했기 때문입니다. 이것은 당신이 알아야 할 또 다른 일입니다.

+0

Re. (2) bodyStream.BaseStream.Seek (0, SeekOrigin.Begin)을 추가해야합니다. after var bodyText = bodyStream.ReadToEnd(); ? – tom

+0

Re. (1) 지적 해 주셔서 감사합니다. 가까운 미래에 IIS에서 호스팅 할 예정입니다. – tom

+0

예, 처음에는 더 안전한 쪽을 찾을 수 있습니다. – Badri

0

나는 Http Request의 InputStream을 사용해야했다. URL 요청에 일부 매개 변수가 포함되어 있고 URL 정보에서 매개 변수를 찾지 못하면 요청 본문을 읽고 정상적으로 작동하는 웹 애플리케이션과 IOS 응용 프로그램이 aspx 페이지로 이동합니다.

 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) 

        { 
    .... 
관련 문제