1

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

// 请求包含'a=1&b=2&c=3'
// TEST ONLY:读取整个请求
字符串内容;
使用 (StreamReader sr = new StreamReader(context.Request.InputStream))
{
    内容 = sr.ReadToEnd();
}
// 这里的 'contents' 通常是正确的 - 包含 'a=1&b=2&c=3'。有时它是空的。

字符串 a = context.Request["a"];

// 这里,a = null,不管上面的'contents'变量是否正确

谁能向我解释为什么会发生这种情况?如果有任何区别,我正在使用 .NET WebClient 和 UploadDataAsync 在客户端上执行请求。

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

4

1 回答 1

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等代理工具在请求离开浏览器时对其进行检查。

于 2010-03-26T17:05:27.727 回答