2010-03-26 74 views
1

我有一个运行HttpHandler类的Web服务。在这个类中,我检查了表单/查询字符串参数的请求流。在某些情况下,似乎这些参数没有通过。经过一番挖掘,我发现了一些我不太明白的行为。见下:奇数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'? – 2010-03-26 17:06:34

回答

0

你为什么要检查查询字符串参数的请求流? .Net中有许多内置的类型来处理HTTP请求。您可以使用以下代码轻松地从querystring中获取正确的NameValueCollection;

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

string value = queryStringValues["my_key"]; 

在你的代码有StreamReader读取流,并指定这叫做contents一个字符串变量。但是,如果将值分配给字符串a,则可以访问一个名为context的变量,我认为它的确是HttpContext.Current。然后,您使用Request对象作为NameValueCollection。当您访问Request集合时,它会查找同时检查Request.FormRequest.QueryString的POST和GET参数。

除非HTTP请求管道进一步改变请求enroute,否则不会丢失参数。使用代理工具(如FiddlerCharles)在请求离开浏览器时检查该请求。

+0

感谢您的回复。我没有检查查询字符串参数,我正在检查GET或POST数据的请求(即Content-Type:application/x-www-form-urlencoded)。在这种情况下,数据是POST-ed的,所以我期望使用Request []索引器来检查QueryString和Form集合。但似乎没有。 我目前正在通过使用GET参数来避开它,但我更喜欢使用POST,如果我可以让它正常工作。 – Barg 2010-03-26 17:28:07