ASP.NET MVC5定制入站路由
问题描述:
我正在使用自定义入站URL路由“玩”,并遇到了问题。ASP.NET MVC5定制入站路由
当我将自定义路由传递给一个要检查的URL时,以*。+结尾,当我提交请求时,我的类不会被触发。
一个例子URL是“〜/老/ windows.html”
当我通过这个在调试步骤,我RouteBase执行不火。如果我编辑我传递给我的路由的构造函数的url以尝试匹配“〜/ old/windows”,我的实现将按预期启动。
再说一遍,如果我将URL更改为“〜/ old/windows”。问题再次出现。
我的路线实现如下: -
public class LegacyRoute : RouteBase
{
private string[] _urls;
public LegacyRoute(string[] targetUrls)
{
_urls = targetUrls;
}
public override RouteData GetRouteData(HttpContextBase httpContext)
{
RouteData result = null;
string requestedURL = httpContext.Request.AppRelativeCurrentExecutionFilePath;
if (_urls.Contains(requestedURL, StringComparer.OrdinalIgnoreCase))
{
result = new RouteData(this, new MvcRouteHandler());
result.Values.Add("controller", "Legacy");
result.Values.Add("action","GetLegacyURL");
result.Values.Add("legacyURL", requestedURL);
}
return result;
}
public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
{
return null;
}
}
在我已经注册了,像这样我的路线RoutesConfig文件: -
routes.MapMvcAttributeRoutes();
routes.Add(new LegacyRoute(new[]{"~/articles/windows.html","~/old/.Net_1.0_Class_Library"}));
任何人都可以指出为什么有问题?
答
默认情况下,.html
扩展名不由.NET处理,它由IIS直接处理。
<handlers>
<add name="HtmlFileHandler" path="*.html" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
正如指出的here - 您可以通过<system.webServer>
下加入Web.config中的以下部分覆盖。上述操作会将每个.html
文件请求路由到.NET,如果您不希望路由处理每个.html
文件,则可以通过提供更完整的路径来更具体地指定。
答
我发现了这个问题,我相信这会帮助很多开发人员。
问题在于通过Visual Studio运行的IIS Express。
有一个在对ApplicationHost.config配置模块调用: -
UrlRoutingModule-4.0
这是它的外观在文件: -
<add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" preCondition="managedHandler,runtimeVersionv4.0" />
您需要设置“”的参数preCondition参数。在系统托盘通过Visual Studio中的应用程序
- 运行你
- 右键点击IIS Express中,选择“显示所有的应用程序”
- 单击要到项目 - :
要做到这一点编辑,然后点击配置URL。
- 用Visual Studio打开文件,找到模块并修改。
希望这可以帮助任何遇到类似问题的人。