背景:ASP.NET MVC运行在IIS中,带有UTF-8%编码的URL.

使用标准项目模板和HomeController中的测试操作,例如:

public ActionResult Test(string id)
{
    return Content(id, "text/plain");
}

这适用于大多数编码的UTF-8路由,例如:

http://mydevserver/Home/Test/%e4%ba%ac%e9%83%bd%e5%bc%81

达到了预期的效果京都弁

但是,使用该路由时,请执行以下操作:

http://mydevserver/Home/Test/%ee%93%bb

url被正确接收not次.

旁白:%ee%93%bb%是编码代码点0xE4FB;基本多语言平面,私有使用区域;但最终——一个有效的unicode代码点;您可以手动或通过以下方式进行验证:

string value = ((char) 0xE4FB).ToString();
string encoded = HttpUtility.UrlEncode(value); // %ee%93%bb

现在,接下来会发生什么取决于web服务器;在VisualStudio开发服务器(又名cassini)上,会收到正确的id,这是一个长度为1的字符串,包含代码点0xE4FB.

然而,如果我在IIS或IIS Express中这样做,我会得到不同的id,特别是"î“»",代码点:0xEE、0x201C、0xBB.您将立即识别第一个和最后一个作为百分比编码字符串的开始和结束...中间发生了什么?

好:

在我看来,IIS在处理我的url时执行了某种引用翻译.现在这可能在一些场景中使用(我不知道),但是当它在一%编码的UTF-8块中发生时,这肯定是一件坏事.

请注意,HttpContext.Current.Request.Raw also显示已经发生了这种转换,所以这看起来不像是MVC错误;还要注意Darin的 comments ,强调它在url的路径和查询部分的工作方式不同.

所以(两方):

  1. 我的分析是否遗漏了unicode/url处理的一些重要细节?
  2. 我怎么才能修好它呢?(即,使我收到预期的字符)

推荐答案

最终,为了解决这个问题,我不得不使用request.ServerVariables["HTTP_URL"]和一些手动解析,并使用一系列错误处理后备(此外还补偿了Uri中的一些相关故障).不是很好,但只影响极少数尴尬的请求.

Asp.net相关问答推荐

无法在Microsoft Windows Server 2016(数据中心)上运行.NET可移植性分析器

在 AppConfig.json 中存储对象的最佳方式

Dotnet core 2.0 身份验证多模式身份 cookie 和 jwt

加载特定 UpdatePanel 后如何调用客户端 javascript 函数

无法访问,内部,资源文件?

如何在asp.net中判断会话是否过期

无法确定条件表达式的类型,因为 'string' 和 'System.DBNull' 之间没有隐式转换

ASP.NET MVC4 异步控制器 - 为什么要使用?

LINQ to Entities 无法识别 MVC 4 中的System.String ToString()方法

页面在谷歌浏览器中加载两次

Eval()、XPath() 和 Bind() 等数据绑定方法只能在数据绑定控件的上下文中使用

如何设置默认页面 asp.net

如何在 asp.net 中更改 DataBinder.Eval 的日期格式?

如何在 ASP.Net Gridview 中添加确认删除选项?

.NET 4.0 中的自定义 MembershipProvider

模型是否包含字段而不将其添加到数据库中?

会员生成密码 仅限字母数字密码?

使用 .NET 连接到 AS400

C# - 将图像输出到响应输出流给出 GDI+ 错误

在 ASP.NET Web API 2 中禁用 *all* 异常处理(为我自己腾出空间)?