C#HttpListenerRequest QueryString UTF-8解码问题

时间:2018-02-21 11:27:38

标签: c# utf-8 query-string httplistenerrequest

我使用HttpListener编写了一个http服务。 该服务接收GET请求,使用单个查询字符串变量req保存json编码字符串中的所有参数,然后执行某些任务。

请求从其他服务器生成,查询字符串使用UTF-8进行URL编码。

问题是来自Request实例的HttpListenerContext对象正在使用Encoding.Default而不是UTF-8解码查询字符串。

例如,如果我将此请求发送到服务器:

http://myserver/?req={"name":"Micciché"}

在发送之前已正确编码到此网址:

http://myserver/?req=%7B%22name%22%3A%22Miccich%C3%A9%22%7D

(请注意,é字符在UTF-8中正确变为%C3%A9

当我在服务器上收到请求并尝试使用以下代码读取和解析req变量时:

string jsonreq = context.Request.QueryString["req"] ?? "";

MyRequest reqObj = JsonConvert.DeserializeObject<MyRequest> (jsonString);

应用了错误的编码,字符串"Micciché"变为"Micciché"

我一直在寻找一种强制执行UTF-8解码的方法,但到目前为止我一无所获。 在Microsoft GitHub参考源上浏览HttpListenerRequest类源代码,似乎只有在请求中有正文时才会从Content-Type请求标头中提取应用的编码,这不是我的情况。

到目前为止唯一的快速&amp;我发现的脏解决方案是使用来自HttpUtility.UrlDecode命名空间的System.Web手动重新解析原始查询字符串,我宁愿避免使用它:

NameValueCollection qs = HttpUtility.ParseQueryString(context.Request.Url.Query, Encoding.UTF8);
string jsonreq = qs["req"] ?? "";

MyRequest reqObj = JsonConvert.DeserializeObject<MyRequest> (jsonString);

此外,我还想避免双重解析查询字符串的负担(一个来自HttpListenerRequest,另一个来自我的代码)。

如何强制HttpListenerRequest始终使用UTF-8解码查询字符串?

0 个答案:

没有答案