IIS 6 上的 ASP.NET MVC - 通配符映射 - 传入请求与任何路由都不匹配

Posted

技术标签:

【中文标题】IIS 6 上的 ASP.NET MVC - 通配符映射 - 传入请求与任何路由都不匹配【英文标题】:ASP.NET MVC on IIS 6 - wildcard mapping - the incoming request does not match any route 【发布时间】:2010-09-21 12:20:00 【问题描述】:

我一直在尝试在 IIS 6 上设置我的 Beta 1 MVC 应用程序,但无法使其正常运行。我已按照其他博客文章中的建议向 .net isapi DLL 添加了通配符映射,但是当我访问网站的根目录时出现以下错误:

The incoming request does not match any route.
..
[HttpException (0x80004005): The incoming request does not match any route.]
   System.Web.Routing.UrlRoutingHandler.ProcessRequest(HttpContextBase httpContext) +147
   System.Web.Routing.UrlRoutingHandler.ProcessRequest(HttpContext httpContext) +36
   System.Web.Routing.UrlRoutingHandler.System.Web.IHttpHandler.ProcessRequest(HttpContext context) +4
   HCD.Intranet.Web.Default.Page_Load(Object sender, EventArgs e) +81
   System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +15
   System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +33
   System.Web.UI.Control.OnLoad(EventArgs e) +99
   System.Web.UI.Control.LoadRecursive() +47
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1436

我正在使用 MVC 模板应用程序中提供的 Default.aspx 页面,该页面正确地重写了对网站根目录的访问。

public partial class Default : Page

    public void Page_Load(object sender, System.EventArgs e)
    
        HttpContext.Current.RewritePath(Request.ApplicationPath);
        IHttpHandler httpHandler = new MvcHttpHandler();
        httpHandler.ProcessRequest(HttpContext.Current);
    

如果我尝试访问应用程序中的路由,例如 /Project,我会得到标准的 IIS 404 错误页面,而不是 .net 错误页面。

我尝试将以下行添加到我的 Web.config httpHandlers 部分:

<add verb="*" path="*" validate="false" type="System.Web.Mvc.MvcHttpHandler, System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>

这给了我一个不同的错误 - .net 404 错误页面。

我在我的 Global.asax 中添加了以下内容,但它什么也没做:

protected void Application_BeginRequest(object sender, EventArgs e)

    if (Context.Request.FilePath.Equals("/"))
        Context.RewritePath("Default.aspx");

我正在使用以下路由配置(使用 MvcContrib 项目提供的 restful 路由):

routes.IgnoreRoute("resource.axd/*pathInfo");
SimplyRestfulRouteHandler.BuildRoutes(routes);
routes.MapRoute(
"Default", 
"controller/action/id",
new  controller = "Home", action = "Index", id = "" 
);

任何建议都会受到欢迎,因为我目前已经用尽了所有选项。

非常感谢。

【问题讨论】:

【参考方案1】:

不幸的是,IIS 6 需要一个文件扩展名来将请求映射到正确的处理程序,这意味着您必须在控制器名称上使用 .mvc 后缀,例如 /controller.mvc/action

routes.IgnoreRoute("resource.axd/*pathInfo");

SimplyRestfulRouteHandler.BuildRoutes(routes);

routes.MapRoute(
      "Default",
      "controller.mvc/action/id",
      new  controller = "Home", action = "Index", id = "" 
);

但是,解决此问题的方法取决于您对 IIS 6 服务器的控制级别。更多信息请参考以下页面

http://biasecurities.com/blog/2008/how-to-enable-pretty-urls-with-asp-net-mvc-and-iis6/ http://www.flux88.com/UsingASPNETMVCOnIIS6WithoutTheMVCExtension.aspx

【讨论】:

【参考方案2】:

这是我为使无扩展名 URL 与 IIS 6 和 ASP.NET MVC Beta 1 一起使用所做的工作。

创建默认的 ASP.NET MVC Beta 项目并编译它。 创建一个新的 IIS 网站指向 应用程序目录。 在 IIS 属性中 网站,点击主目录 标签。 单击“配置...”按钮。 在“映射”选项卡中,单击 “插入...” 在“通配符应用程序”旁边 地图”标签 在文本框中,输入 "c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll" 取消选中标有“验证 该文件存在”点击确定 导航到 /home 成功了!

您根本不需要更改 web.config。您只需要将所有到 IIS 的请求映射到 ASP.NET Isapi dll,否则 ASP.NET 将永远不会收到这些请求。

【讨论】:

感谢您发布此内容,尤其是我忘记的“取消选中标有“验证该文件存在”的框单击“确定”步骤。【参考方案3】:

好的,搞定了。

问题是我使用 msbuild 自动化来打包我需要部署的文件,而我缺少 global.asax。

所以看起来如果 global.asax 没有部署到站点,那么任何路由都不会被连接。这意味着正确点击网站根目录会导致错误“传入的请求与任何路由都不匹配。”,并且任何其他请求不再路由到您的控制器类,因此会导致 404。

HTH。

【讨论】:

完美——这是我的问题。我是通过 NAnt/MSBuild 构建的,不包括 Global.asax 文件。拥有该文件可以解决所有问题。 嗯,我也有同样的问题,我也是使用构建脚本打包文件,但是我的 Global.asax 文件肯定存在于 web 根文件夹中。

以上是关于IIS 6 上的 ASP.NET MVC - 通配符映射 - 传入请求与任何路由都不匹配的主要内容,如果未能解决你的问题,请参考以下文章

在 IIS 上使用 .NET Core 运行 ASP.NET 5 (MVC 6)

iis6 上的 Asp.net mvc 4:“找不到页面”

IIS6 上的 ASP.NET MVC

IIS 7.5 上的 ASP.NET MVC

IIS 7.5 上的 ASP.NET MVC

诊断 IIS 7 和 ASP.NET MVC 上的 404 错误