【问题标题】:ASP.net MVC HttpException strange file not found找不到 ASP.net MVC HttpException 奇怪的文件
【发布时间】:2010-12-22 21:26:37
【问题描述】:

我在 IIS6 上运行 asp.net MVC 站点 - 我已将路由编辑为如下所示:

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

        routes.MapRoute(
         "Root",
         "",
         new { controller = "Home", action = "Index", id = "" }
       );

所以我所有的网址现在都包含 .aspx(根据 Phil Haack 的解决方案之一)。现在,我使用 Elmah 捕获所有未处理的异常,并且对于几乎每个页面请求,我都会收到 Elmah 捕获的以下错误,这是我在前端从未看到的(一切正常):

System.Web.HttpException: The file '/VirtualDirectoryName/Home.aspx' does not exist.

System.Web.HttpException: The file '/VirtualDirectoryName/Home.aspx' does not exist.
   at System.Web.UI.Util.CheckVirtualFileExists(VirtualPath virtualPath)
   at System.Web.Compilation.BuildManager.GetVPathBuildResultInternal(VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile)
   at System.Web.Compilation.BuildManager.GetVPathBuildResultWithNoAssert(HttpContext context, VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile)
   at System.Web.Compilation.BuildManager.GetVirtualPathObjectFactory(VirtualPath virtualPath, HttpContext context, Boolean allowCrossApp, Boolean noAssert)
   at System.Web.Compilation.BuildManager.CreateInstanceFromVirtualPath(VirtualPath virtualPath, Type requiredBaseType, HttpContext context, Boolean allowCrossApp, Boolean noAssert)
   at System.Web.UI.PageHandlerFactory.GetHandlerHelper(HttpContext context, String requestType, VirtualPath virtualPath, String physicalPath)
   at System.Web.UI.PageHandlerFactory.System.Web.IHttpHandlerFactory2.GetHandler(HttpContext context, String requestType, VirtualPath virtualPath, String physicalPath)
   at System.Web.HttpApplication.MapHttpHandler(HttpContext context, String requestType, VirtualPath path, String pathTranslated, Boolean useAppConfig)
   at System.Web.HttpApplication.MapHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
   at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

有一个 Home 控制器,应该可以找到它,但我不确定 a) 从哪里调用它,以及 b) 为什么我在前端看不到这个错误。有什么想法吗?

【问题讨论】:

    标签: asp.net-mvc iis-6 routing


    【解决方案1】:

    我认为这是因为您的路由中有 .aspx 扩展名。它应该映射到控制器,但 .aspx 文件实际上是视图。如果你像这样运行它会发生什么......

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

    【讨论】:

    • 有 .aspx 扩展名,因为它是必需的。这允许我在 IIS6 上本地运行,它不支持上述方法。
    【解决方案2】:

    我不太确定,但是当我将 global.asax 设置为在 IIS 6 上运行时,

    使用 .mvc 扩展名,路由不包含控制器:

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

    如果您将“.mvc”更改为“.aspx”,它可能会起作用
    我不太确定.aspx 方式是否应该这样设置。这可能有效。试一试

    【讨论】:

    • 谢谢,我会调查那个。
    【解决方案3】:

    转到 IIS6 应用程序属性 > 配置并检查 .aspx 扩展名的“验证文件是否存在”未选中。如果被选中,它将无法正常工作。

    【讨论】:

      【解决方案4】:

      如果您打开 IIS 并在 IIS 管理器控制台 (inetmgr.exe) 中右键单击您的网站,您应该能够选择属性并获得一个选项卡式对话框。在此,选择“主目录”然后配置。

      在配置对话框中,您应该获得 ISAPI 应用程序列表。里面有一个扩展名 .* 吗?

      如果没有,那么您需要添加它并将其指向 aspnet_isapi.dll(查看 .aspx 文件的处理程序)。然后 IIS 将知道任何没有扩展名的传入 url(例如 http://localhost/myappp/myPage/ 的 asp.net mvc url)仍将运行 asp.net 扩展名,那么我认为您应该能够在没有 .aspx 位的情况下运行它(您需要在创建过滤器时取消选中“检查文件是否存在”复选框)。

      希望有帮助!

      【讨论】:

      • 我希望不要像这样添加通配符映射 - 我正在尝试的解决方案是在 Steve Sanderson 的博客上。
      【解决方案5】:

      看起来正在发生的事情是,您的站点正在寻找标准 ASP.NET 页面 MVC 路由引擎查看之前,抛出 ELMAH 捕获的异常,然后路由引擎启动,并找到正确的控制器 - 我相信这是标准行为。

      您可以尝试将RouteExistingFiles 设置为true,看看是否会阻止错误出现。

      【讨论】:

        【解决方案6】:

        检查代码的忽略路由部分,一旦我错误地配置了忽略路由部分并且产生了一个奇怪的文件不存在错误..检查并查看

        【讨论】:

          【解决方案7】:

          我最初对此的回答可能有误。我认为问题在于我的网站没有网站图标,并且 MVC 运行时正在处理这个请求(在每次浏览器刷新时)。

          添加一个网站图标和一个忽略路线(如下面链接的问题,似乎可以正确解决这个问题。

          Serving favicon.ico in ASP.NET MVC


          我也将保留此链接,因为我也在这里完成了一些有用的项目:

          ASP.NET MVC on IIS6

          【讨论】:

            猜你喜欢
            • 2023-03-06
            • 1970-01-01
            • 1970-01-01
            • 2011-01-09
            • 2011-10-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多