WebRequest.Create不正确地解码url

时间:2013-04-02 09:28:20

标签: c# unicode webrequest

我有一个这样的网址: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

的一部分

2 个答案:

答案 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);