奇怪的HttpRequest行为

时间:2010-03-26 16:29:35

标签: asp.net request httphandler webclient uploaddataasync

我有一个使用HttpHandler类运行的Web服务。在这个类中,我检查表单/查询字符串参数的请求流。在某些情况下,似乎这些参数没有通过。经过一番挖掘后,我遇到了一些我不太了解的行为。见下文:

// 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在客户端上执行请求,如果这有任何区别的话。

如果您需要更多信息,请告诉我们。

1 个答案:

答案 0 :(得分: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请求管道中的某些内容正在改变请求路由,否则您不会丢失参数。使用FiddlerCharles等代理工具检查请求离开浏览器时。