ASP.NET MVC中URL中的冒号

6
我注意到IIS在URL中允许冒号存在时会出现问题。我也看到其他人在这里提供了建议 在我正在处理的网站上,我希望能够将电影、书籍等标题作为URL传递,包括冒号,就像这样:
mysite.com/Movie/Bob:The Return

这段文字将被我的电影控制器使用,作为字符串并在后续中进一步使用。
我意识到冒号并不理想。有没有其他建议?虽然当前情况很糟糕,但我正在执行查找和替换所有冒号(:)为另一个字符,然后在控制器端消耗时进行反向替换。

为什么会使用冒号?你发现这个在除了IIS之外的服务器上也可以工作吗?我希望不要使用冒号来指定端口号,因为这会使协议解析更加简单。使用连字符、下划线或其他字符。或者像mysite.com/Movie/Bob/The+Return这样再增加一层。 - Jonathan Wood
使用“mysite.com/Movie/Bob/The+Return”存在的问题是如何将电影标题(“Bob:The Return”)转换为“嘿,这个标题中有一个冒号...我需要正确地把它放回去。” - Joe Morgan
也许我应该传入一个包含标题和 slug 的类,而不仅仅是电影标题作为字符串? - Joe Morgan
5个回答

7
我通过将以下内容添加到我的web.config文件中解决了这个问题:
<httpRuntime requestPathInvalidCharacters=""/>

这必须在system.web部分中设置。
默认值为:
<httpRuntime requestPathInvalidCharacters="&lt;,&gt;,*,%,&amp;,:,\,?"/>

所以,只为冒号做一个例外,它将变成
<httpRuntime requestPathInvalidCharacters="&lt;,&gt;,*,%,&amp;,\,?"/>

阅读更多:http://msdn.microsoft.com/en-us/library/system.web.configuration.httpruntimesection.requestpathinvalidcharacters.aspx

据我所知,冒号字符可作为URL中未编码的字符接受。我不知道为什么将其添加到requestPathInvalidCharacters的默认设置中。


3

10
我尝试过编码/解码。但是IIS似乎仍然能够看到它并说:“嘿,那仍然是一个冒号。抛出400错误!” - Joe Morgan

2

您的方法中最大的担心是电影名称并不总是唯一的(例如,“意大利任务”)。而且,还有其他非法字符(例如括号等)。

在网址中使用ID编号来定位您的数据库中的电影可能是个好主意。您仍然可以在网址中包含一个友好的电影名称副本,但您不需要担心所有非法字符都能回到原始标题。

一个很好的例子是这个页面的网址。您可以看到删除页面标题后仍然有效:

ASP.NET MVC中的冒号

ASP.NET MVC中的冒号


这是一个有趣的想法。我需要进一步研究一下。 - Joe Morgan

0

根据RFC 3986,冒号是URI中保留且无效的字符。因此,请不要做违反规范的事情。您需要对其进行URL编码或使用其他字符。这里有一篇不错的博客文章,您可以看一下。


哪里说它是无效的?我是否解释错误?pchar = 未保留字符 / 百分号编码 / 子分隔符 / “:” / “@” - glen-84

0
最简单的方法是在构建URL时使用System.Web.HttpUtility.UrlEncode(),在解释返回结果时使用System.Web.HttpUtility.UrlDecode。如果您不先对值进行编码,还会遇到空格字符的问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接