2010-03-26 4 views
1

HttpHandler 클래스로 실행되는 웹 서비스가 있습니다. 이 클래스에서는 폼/쿼리 문자열 매개 변수에 대한 요청 스트림을 검사합니다. 어떤 상황에서는 이러한 매개 변수가 통과하지 못하는 것처럼 보였습니다. 조금 파고 들자 나는 꽤 이해할 수없는 행동을 보았다. 아래를 참조하십시오 : 이런 일이 될 이유이상한 HttpRequest 동작

 
// The request contains 'a=1&b=2&c=3' 
// TEST ONLY: Read the entire request 
string contents; 
using (StreamReader sr = new StreamReader(context.Request.InputStream)) 
{ 
    contents = sr.ReadToEnd(); 
} 
// Here 'contents' is usually correct - containing 'a=1&b=2&c=3'. Sometimes it is empty. 

string a = context.Request["a"]; 

// Here, a = null, regardless of whether the 'contents' variable above is correct 

이 사람이 나에게 설명 할 수 있습니까? .NET WebClient 및 UploadDataAsync를 사용하여 클라이언트에서 요청을 수행하면 차이가 발생합니다.

더 자세한 정보가 필요하면 알려 주시기 바랍니다.

+0

왜 'context.Request.QueryString'을 사용하지 않습니까? –

답변

0

왜 쿼리 문자열 매개 변수에 대한 요청 스트림을 검사하고 있습니까? .Net에는 HTTP 요청을 처리 할 수있는 많은 내장 유형이 있습니다. 다음 코드를 사용하여 쿼리 문자열에서 적절한 NameValueCollection을 쉽게 얻을 수 있습니다. 코드에서

NameValueCollection queryStringValues = 
    HttpUtility.ParseQueryString(HttpContext.Current.Request.Query.ToLower()); 

string value = queryStringValues["my_key"]; 

당신은 StreamReader 스트림을 읽고 contents라는 문자열 변수에이를 할당 할 수 있습니다. 그러나 문자열 a에 값을 할당하면 context이라는 변수에 액세스하게됩니다. 실제로는 HttpContext.Current입니다. 그런 다음 Request 개체를 NameValueCollection으로 사용합니다. 이와 같이 Request 컬렉션에 액세스하면 POST 및 GET 매개 변수를 모두 확인하여 Request.FormRequest.QueryString을 확인합니다.

HTTP 요청 파이프 라인이 추가로 변경되지 않는 한 enroute 매개 변수가 해제되지 않습니다. Fiddler 또는 Charles과 같은 프록시 도구를 사용하여 브라우저에서 나가는 요청을 검사하십시오.

+0

답장을 보내 주셔서 감사합니다. 쿼리 문자열 매개 변수를 확인하지 않고 GET 또는 POST 데이터 (예 : Content-Type : application/x-www-form-urlencoded)에 대한 요청을 확인했습니다. 이 상황에서 데이터는 POST로 처리되므로 Request [] 인덱서를 사용하여 QueryString 및 Form 컬렉션을 모두 확인해야합니다. 하지만 그렇게 보이지는 않습니다. GET 매개 변수를 사용하는 대신에 GET 매개 변수를 사용하고 있지만 제대로 작동하려면 POST를 사용하는 것이 좋습니다. – Barg