Asp.net mvc 2 MVC参数中的加号(+;)在IIS 7.0上导致404

Asp.net mvc 2 MVC参数中的加号(+;)在IIS 7.0上导致404,asp.net-mvc-2,arguments,asp.net-mvc-routing,Asp.net Mvc 2,Arguments,Asp.net Mvc Routing,我有一个MVC路由,它让我在运行IIS的登台服务器上陷入困境。我正在本地运行VisualStudio2010的开发服务器 下面是一个示例URL,它实际上在我的开发设备上工作: Root/CPUBoards/Full+Size Results Server Error404 - File or directory not found. The resource you are looking for might have been removed, had its name changed, o

我有一个MVC路由,它让我在运行IIS的登台服务器上陷入困境。我正在本地运行VisualStudio2010的开发服务器

下面是一个示例URL,它实际上在我的开发设备上工作:

Root/CPUBoards/Full+Size

Results
Server Error404 - File or directory not found.
The resource you are looking for might have been removed, had its name changed, or is temporarily unavailable.
这是我所看到的全部行为

本地主机:

Root/CPUBoards/Full Size - Resolves
Root/CPUBoards/Full%20Size - Resolves
Root/CPUBoards/Full+Size - Resolves
使用IIS 7.0的临时服务器:

Root/CPUBoards/Full Size - Resolves
Root/CPUBoards/Full%20Size - Resolves
Root/CPUBoards/Full+Size - 404 Not Found Error.
有什么想法吗?我需要使用编码版本有几个原因。。。不会在他们身上浪费你的时间

UrlEncode(“完整大小”)返回带有加号的版本。。。全尺寸。这适用于我的开发设备,但不适用于临时服务器。我更愿意让它在服务器上运行,因为我已经在本地测试并运行了所有其他内容,但我不知道从哪里开始查看服务器配置,以使其以相同的方式运行


谢谢

+
仅具有在
应用程序/x-www-form-urlencoded
数据(如URL的查询字符串部分)中作为空格的特殊含义

在URL的其他部分,如路径组件中,
+
字面意思是加号。因此,将
Full+Size
解析为未编码的名称
Full Size
在任何地方都不起作用

路径组件中唯一正确的空格形式是
%20
。(当您键入实际空格时,它仍然有效,因为浏览器会发现错误并为您更正。)
%20
也适用于格式URL编码的数据,因此通常最安全的方法是始终使用该格式

遗憾的是,
HttpUtility.UrlEncode
的名称有误导性。它在输出中生成
+
,而不是
%20
,因此它实际上是一个表单URL编码器,而不是一个标准的URL编码器。不幸的是,我不知道ASP.NET函数可以在路径中使用“真正的URL编码”字符串,所以我只能建议在编码后将
+
的字符串替换为
%20


或者,避免在路径部分中使用空格,例如用
-
替换它们。通常会将“slug”标题插入URL,将其简化为简单的字母数字和“安全”标点符号,以避免用丑陋的
%nn
序列填充URL。

这是一种IIS安全设置。有一个标准的请求过滤器,它拒绝包含+(加号)字符的URL

您可以为您的web禁用它,并将其添加到您的web.config:

<configuration>
   ...
   <system.webServer>
      ...
      <security>
          <requestFiltering allowDoubleEscaping="true" />
      </security>
    </system.webServer>
    ...
</configuration>

...
...
...

System.Web.HttpUtility.urlpathcode(string str)
+
编码为
%20
完全同意@bobince,问题在于对%2b而不是%20的编码错误

遗憾的是,HttpUtility.UrlEncode的名称有误导性。它在输出中生成+而不是%20,因此它实际上是一个表单URL编码器,而不是一个标准URL编码器。不幸的是,我不知道ASP.NET函数可以在路径中使用“真正的URL编码”字符串,所以我只能建议在编码后将字符串替换为+到%20


这是一个重要的部分,将+符号替换为%20

是否可以使用IIS 7而不是ASP.NET开发环境在本地生成?确定。这很有帮助。这些URL“段”来自数据库,我们更希望数据库中的数据是自然的。我们还需要URL是唯一的,所以用“-”替换一堆内容是不可取的。例如,我们有下划线和空格字符,人们喜欢用破折号来代替它们。我想这意味着我们必须使用像%20这样的“丑陋”来准确地表示字符,但这些都是边缘情况,折衷也不是那么糟糕。我想我必须在URL编码之前做一些手动替换。谢谢不幸的是,您无法将任意字符串放入路径部分<代码>%2F(
/
的编码形式)在Apache中默认被许多web服务器阻止,在IIS中也不可避免地被阻止。IIS也会阻止
%5C
,所有服务器都会阻止
%00
(其他控制代码也会导致各种困难,当然路径部分中的Unicode也有自己的一些缺陷)。我认为OP已经找到了该部分-导致错误的原因更多是问题。对我来说是有效的。有关“allowDoubleEscaping”的更多详细信息,请参见: