【发布时间】:2017-08-16 22:38:58
【问题描述】:
我正在使用 HttpListener 为在 localhost 上以另一种技术编写的应用程序提供 Web 服务器。该应用程序使用简单的表单提交 (application/x-www-form-urlencoded) 向我的软件发出请求。我想知道是否已经编写了一个解析器来将 html 请求文档的正文转换为哈希表或等效项。
考虑到 .NET 似乎已经提供了多少,我很难相信我需要自己编写这个。
提前致谢,
【问题讨论】:
我正在使用 HttpListener 为在 localhost 上以另一种技术编写的应用程序提供 Web 服务器。该应用程序使用简单的表单提交 (application/x-www-form-urlencoded) 向我的软件发出请求。我想知道是否已经编写了一个解析器来将 html 请求文档的正文转换为哈希表或等效项。
考虑到 .NET 似乎已经提供了多少,我很难相信我需要自己编写这个。
提前致谢,
【问题讨论】:
你的意思是像HttpUtility.ParseQueryString 这样给你一个NameValueCollection?这是一些示例代码。您需要更多的错误检查,并且可能使用请求内容类型来确定编码:
string input = null;
using (StreamReader reader = new StreamReader (listenerRequest.InputStream)) {
input = reader.ReadToEnd ();
}
NameValueCollection coll = HttpUtility.ParseQueryString (input);
如果您使用的是 HTTP GET 而不是 POST:
string input = listenerRequest.Url.QueryString;
NameValueCollection coll = HttpUtility.ParseQueryString (input);
【讨论】:
HTTP-GET 而不是 HTTP-POST。不是吗?
填写 HttpRequest.Form 的神奇位在 System.Web.HttpRequest 中,但它们不是公开的(反射该类上的“FillInFormCollection”方法以查看)。您必须将管道与 HttpRuntime 集成(基本上是编写一个简单的 ASP.NET 主机)才能充分利用。
【讨论】:
如果您想避免使用HttpUtility.ParseQueryString 所需的对System.Web 的依赖,您可以使用System.Net.Http 中的ParseQueryString 扩展方法ParseQueryString。
确保在您的项目中添加对System.Net.Http 的引用(如果您还没有)。
请注意,您必须将响应正文转换为有效的 Uri,以便 ParseQueryString(在 System.Net.Http 中)有效。
string body = "value1=randomvalue1&value2=randomValue2";
// "http://localhost/query?" is added to the string "body" in order to create a valid Uri.
string urlBody = "http://localhost/query?" + body;
NameValueCollection coll = new Uri(urlBody).ParseQueryString();
【讨论】: