背景: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相关问答推荐

C# - 将 xyz 平铺转换为纬度/经度,反之亦然,给出不同的结果

Web API Queryable - 如何应用 AutoMapper?

ASP.NET Web 应用程序 (.NET Framework) 与 ASP.NET Core Web 应用程序 (.NET Framework) 之间的差异

解析器错误消息:文件/TestSite/Default.aspx.cs不存在

为什么 ASP.NET Identity 2.0 使用 GUID/字符串作为用户 ID?

你如何确定哪个验证器失败了?

从 JavaScript 读取 web.config

与将 Web 应用程序保存在一个默认应用程序池中相比,拥有专用应用程序池的优缺点

会话变量保存在哪里?

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

ASP.NET 会话超时测试

如何在 ASP.NET Core Web API 中配置 JSON 格式的缩进

如何在不预编译的情况下使用命令行msbuild部署VS2012网站项目?

Azure Functions 中的 DI

为什么 HttpWebRequest 会抛出异常而不是返回 HttpStatusCode.NotFound?

将字符串转换为时间

Request.UserHostAddress 和 Request.ServerVariables["REMOTE_ADDR"].ToString() 有什么区别

如何使用 int ID 列更改 ASP.net Identity 2.0 的表名?

在没有等待 #2 的情况下调用异步方法

ASP.NET 自定义控件 - 未知的服务器标记