ASP.NET路由:令牌之间的文字子段,以及带有来自文字子段的字符的路由值

Max*_*oro 12 asp.net iis routing asp.net-routing

我问的原因是因为IIS保护某些ASP.NET文件夹,如Bin,App_Data,App_Code等.即使URL没有映射到实际的文件系统文件夹,IIS也会拒绝路径段等于其中一个的URL提到的名字.

这意味着我不能有这样的路线:

{controller}/{action}/{id}
Run Code Online (Sandbox Code Playgroud)

...其中id可以是任何字符串,例如

Catalog/Product/Bin
Run Code Online (Sandbox Code Playgroud)

因此,我没有禁用此安全措施,而是愿意在id之前使用后缀更改路由,如下所示:

{controller}/{action}_{id} // e.g. Catalog/Product_Bin
{controller}/{action}/_{id} // e.g. Catalog/Product/_Bin
Run Code Online (Sandbox Code Playgroud)

但是如果id包含新的分隔符,这些路由将不起作用,在这种情况下,例如

// These URL won't work (I get 404 response)
Catalog/Product_Bin_
Catalog/Product/_Bin_
Catalog/Product/__Bin
Run Code Online (Sandbox Code Playgroud)

为什么?我不知道,对我来说就像一个小虫.如何使这些路由工作,其中id可以是任何字符串?

Haa*_*ked 7

好的,我有一个明确的答案.是的,这是一个错误.但是,在这一点上,我遗憾地说我们没有计划解决它,原因有两个:

  • 这是一个突破性的变化,可能很难注意到这一点.
  • 有一个简单的解决方法.

您可以做的是将URL更改为不具有下划线:

{controller}/{action}/_{id}
Run Code Online (Sandbox Code Playgroud)

然后添加一个路由约束,该约束要求ID参数以下划线字符开头.

然后在您的操作方法中,您将从id参数中删除下划线前缀.如果您愿意,您甚至可以编写动作过滤器来为您执行此操作.抱歉给你带来不便.