我使用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解码查询字符串?