【问题标题】:MVC3 app on IIS7.5 with route to file x.jpg not workingIIS7.5 上的 MVC3 应用程序与文件 x.jpg 的路由不起作用
【发布时间】:2011-12-12 12:49:05
【问题描述】:

当我的干净、刚刚创建的新应用程序(.net 4.0 集成)在 Visual Studio Web 服务器上时,一切正常。像下面这样的链接工作正常,控制器返回图像。

http://localhost:12345/image/a.jpg

但是当我在 IIS 7.5 上运行这个应用程序时,iis 会控制并报告 404。

http://localhost/testmvc3/image/a.jpg

控制器:

public class ImageController : Controller
{
    public ActionResult Index(string name)
    {
        var dir = Server.MapPath("~/content/" + name);
        return File(dir, "image/jpg");
    }
}

路线:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        "Image", // Route name
        "image/{*name}", // URL with parameters
        new { controller = "Image", action = "Index", name = UrlParameter.Optional } // Parameter defaults
    );

    routes.MapRoute(
        "Default", // Route name
        "{controller}/{action}/{id}", // URL with parameters
        new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
    );
}

我应该改变什么才能正常运行这个应用程序?

编辑1:
问题在于扩展。当我删除扩展时,请求指向图像控制器。使用扩展名 (jpg) iis 首先接受请求(为什么!?)并返回 404(不涉及图像控制器操作)。

EDIT2:

  • Windows 7 64 位上的 IIS 7.5
  • Framework 4.0 集成管道上的应用

我的更改之前的 web.config:

<system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
    <modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>

【问题讨论】:

    标签: asp.net-mvc-3 .net-4.0 routing iis-7.5


    【解决方案1】:

    您不应该被要求这样做。确保您的应用程序池在集成管道模式下运行。

    【讨论】:

    • 对不起,你的第一句话是在谈论开发服务器,我错过了。我尝试了您的方案,一切都开箱即用。当我切换到经典管道时,我收到了您描述的 404 错误
    【解决方案2】:

    我找到了。呃……

    我将 ExtensionlessUrlHandler 路径从默认的 '*.' 更改为 '*':

    <handlers>
        <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
        <add
            name="ExtensionlessUrlHandler-Integrated-4.0"
            path="*"
            verb="GET,HEAD,POST,DEBUG"
            type="System.Web.Handlers.TransferRequestHandler"
            resourceType="Unspecified"
            requireAccess="Script"
            preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
    

    现在所有请求都通过路由引擎。

    然后我将 IgnoreRoute 添加到 'content/{*all}' 我拥有所有静态内容文件的位置。

    【讨论】:

      【解决方案3】:

      在项目的属性中,在 Web 选项卡上,在单选按钮 Use Local IIS Web Server 下方的部分中,在项目 URL 框中,将条目更改为 http://localhost:12345

      然后,在 IIS 中,编辑 localhost 站点的 http 绑定,并将其更改为 12345。

      【讨论】:

      • 将 Phil Haack 的 Route Debugger NuGet 包添加到您的项目中,并在页面底部检查路由结果。
      • 正如我所说的路由引擎没有启动。 IIS 立即报告 404。
      【解决方案4】:

      如果解决方案已部署,也就是说,不仅映射到您的解决方案,而是按应有的方式部署,Server.MapPath 的结果将与您预期的不同。 Server.MapPath“default”文件夹是实际 dll 所在的位置。

      解决此问题的一种方法是将图像的“复制到输出目录”设置为“复制 alwats”或“如果较新则复制”。

      您也许可以使用 Server.MapPath("~/content" + name); 之类的东西,但这样会使您的解决方案找不到图像。

      【讨论】:

      • 问题出在 IIS 上,它首先采用路由并将其与不存在的文件匹配。为什么 IIS 会控制我的应用程序?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-13
      • 1970-01-01
      相关资源
      最近更新 更多