我有一个这样的网址:http://localhost:8080/search.json?q=L%u00e6r
,这是对Lær的编码搜索。
不幸的是,使用WebRequest.Create(url)
从此网址创建WebRequest会产生以下网址:http://localhost:8080/search.json?q=L%25u00e6r
。
请注意,它错误地解码%u00e6
,并生成%25u00e6r
。有没有办法转换这种unicode转义值或让WebRequest.Create正确处理它?</ p>
这很可能会被报告为.net团队的错误。如果查询包含§,æ,ø或å(或任何其他非ascii字符),则WebRequest.Create()
无法使用Request.QueryString.ToString()
返回的查询字符串。这是一个小的mvc动作,可用于测试它。使用查询Query?q=L%C3A6r
public ActionResult Query()
{
var query = Request.QueryString.ToString();
var url = "http://localhost:8080?" + query;
var request = WebRequest.Create(url);
using (var response = request.GetResponse())
using (var stream = response.GetResponseStream())
{
return new FileStreamResult(stream, "text/plain");
}
}
修改:
不幸的是,@ animaonline的解决方案不适用于http://localhost:8080/search.json?q=Lek+%26+L%u00e6r
这样的网址,这些网址被解码为http://localhost:8080/search.json?q=Lek & Lær
,其中WebRequest.Create
对&
感到困惑,并认为它将参数分开,而不是参数q
。
答案 0 :(得分:5)
您必须在执行创建
之前解码您的URL var decodedUrl = HttpUtility.UrlDecode("http://localhost:8080/search.json?q=L%u00e6r");
var req = WebRequest.Create(decodedUrl);
答案 1 :(得分:3)
解决方案似乎是将查询字符串拆分为每个单独的组件,对其进行解码,然后将其重新编码为UTF-8,然后再将它们连接在一起。
string FixQuery(string query){
return String.Join("&",
query.Split(new[] {'&'})
.Select(
p =>
String.Join("=",
p.Split(new[] {'='})
.Select(
q =>
HttpUtility.UrlEncode(
HttpUtility.UrlDecode(q),
Encoding.UTF8
)
)
)
)
);
}
//example usage
var url = "http://localhost:8080/search?"+FixQuery(query);