WebRequest.Create不正确地解码url

Mar*_*ius 5 c# unicode webrequest

我有一个这样的网址:http://localhost:8080/search.json?q=L%u00e6r,这是对Lær的编码搜索.

不幸的是,使用此url创建WebRequest WebRequest.Create(url)会产生以下url : http://localhost:8080/search.json?q=L%25u00e6r.

请注意,它错误地解码%u00e6并生成%25u00e6r.有没有办法转换这种unicode转义值或让WebRequest.Create正确处理它?

这很可能会被报告为.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");
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:

不幸的是,@ animaonline的解决方案不适http://localhost:8080/search.json?q=Lek+%26+L%u00e6r用于那些被解码的网址http://localhost:8080/search.json?q=Lek & Lær,在这里WebRequest.Create被混淆了&,并认为它将参数分开,而不是参数的一部分q.

ani*_*ine 5

您必须在执行Create之前解码您的URL

        var decodedUrl = HttpUtility.UrlDecode("http://localhost:8080/search.json?q=L%u00e6r");

        var req = WebRequest.Create(decodedUrl);
Run Code Online (Sandbox Code Playgroud)


Mar*_*ius 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);
Run Code Online (Sandbox Code Playgroud)