C# 如何允许URL在ASP.NET MVC5中包含点?
我正在开发一个允许在URL中使用点的网站,比如C# 如何允许URL在ASP.NET MVC5中包含点?,c#,asp.net,regex,asp.net-mvc,asp.net-mvc-5,C#,Asp.net,Regex,Asp.net Mvc,Asp.net Mvc 5,我正在开发一个允许在URL中使用点的网站,比如www.mysite.com/somedata/my.name-123。 我期望的行为是使该url等效于www.mysite.com/somedata/myname-123,但我得到的是404个错误,因为这些点使IIS尝试查找静态文件。可以找到一个类似的问题,但正如我在下面解释的那样,建议的解决方案在我的案例中不起作用。这就是我尝试过的: 添加一个新的处理程序(如建议的)不起作用,因为我需要它来处理多个路径。如果我设置path=“*”则所有静态文件
www.mysite.com/somedata/my.name-123
。
我期望的行为是使该url等效于www.mysite.com/somedata/myname-123
,但我得到的是404个错误,因为这些点使IIS尝试查找静态文件。可以找到一个类似的问题,但正如我在下面解释的那样,建议的解决方案在我的案例中不起作用。这就是我尝试过的:
- 添加一个新的处理程序(如建议的)不起作用,因为我需要它来处理多个路径。如果我设置path=“*”则所有静态文件(例如.css文件)都会失败。我可以使用正则表达式指定url模式,但据我所知,path属性不允许使用它(只允许使用通配符)
- 在MVC5中,在web.config中使用像
和
这样的行根本不起作用 - 将
添加到web.config中的system.webServer部分实际上是可行的,但由于许多原因,不鼓励这种做法,这是公开的,因此如果可能的话,我尝试避免这种方法 - 在URL后面加一个斜杠(/)也可以解决这个问题,但是这样做会让Google认为我提供的是重复内容,所以我不能使用这个解决方案
更新: 我找到了一个适合我的解决方案。我将尝试解释我采取的步骤: 首先,我找到了一个很好的解释,解释了为什么会发生这种行为:。还讨论了上面列出的一些解决方案。在对文章进行放射线处理后,我决定使用重写规则处理虚线URL。我没有添加一个尾随斜杠,而是决定在没有麻烦点的情况下提供url,然后检查用户在我的应用程序的控制器中寻找什么。我的基本规则如下所示:
<rule name="remove troublesome dots" stopProcessing="false">
<match url="^(.*)\.(\S*)$" />
<conditions>
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
</conditions>
<action type="Rewrite" url="{R:1}{R:2}" />
</rule>
,在“为特定文件结尾添加条件”部分。我记得几个月前遇到过这种情况。我真的很匆忙,所以我所做的可能不是推荐的方法
我只指定了一个段,然后创建了相应的正则表达式作为约束
例如,结果会是这样的:
url:somedata/{dottered}
约束:虚线:“(.*\)*.*”
正则表达式是非常通用的,为了避免无效的符号,您应该将它重新格式化为只接受支持的字符。您在哪里声明的?在RouteConfig文件中?否则,在web.config的哪个部分允许这样做?我们有自己的XML文件用于声明路由,但您应该在RouteConfig.cs
中进行配置。声明新路由时不应触摸Web.config
。这对我不起作用,因为圆点使IIS认为正在请求文件,因此永远无法访问路由处理程序。解释得很好。他还提供了一些解决方案,可能会有助于解决我同样的问题。