Asp.net mvc 3 IIS7.5上的MVC3应用程序,路径为文件x.jpg不工作

Asp.net mvc 3 IIS7.5上的MVC3应用程序,路径为文件x.jpg不工作,asp.net-mvc-3,.net-4.0,routing,iis-7.5,Asp.net Mvc 3,.net 4.0,Routing,Iis 7.5,当我的新应用程序(.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 ActionRes

当我的新应用程序(.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(不涉及图像控制器操作)

编辑2:

  • Windows 7上的IIS 7.5 64位
  • 框架4.0集成管道上的应用程序
更改之前的web.config:

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

如果部署了解决方案,也就是说,不仅针对您的解决方案进行了映射,而且还按照应该的方式进行了部署,
Server.MapPath
的结果将不符合您的预期。
Server.MapPath
“default”文件夹是实际dll所在的文件夹

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


您可以使用类似于
Server.MapPath(“~/content”+name”)的东西,但我认为这将使您的解决方案无法找到映像。

如果部署了解决方案,即不仅映射到您的解决方案,而是按照它应该的方式进行部署,那么
Server.MapPath
的结果将不会如您预期的那样。
Server.MapPath
“default”文件夹是实际dll所在的文件夹

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


您可以使用类似于
Server.MapPath(“~/content”+name”)的东西,但这将使您的解决方案无法找到图像。

在项目属性的“Web”选项卡上,单选按钮下方的“使用本地IIS Web服务器”部分,在项目Url框中,将条目更改为
http://localhost:12345


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

在项目属性的“Web”选项卡上,单选按钮下方的“使用本地IIS Web服务器”部分中,在项目Url框中,将条目更改为
http://localhost:12345

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

我找到了它。啊

我将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},在那里我有所有静态内容文件。

我找到了它。啊

我将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}”中,在那里我有所有静态内容文件。

您不需要这样做。确保应用程序池以集成管道模式运行。

您不需要这样做。确保应用程序池以集成管道模式运行。

问题在于IIS首先采用路由,并将其与不存在的文件相匹配。为什么IIS会控制我的应用程序?问题在于IIS首先选择路由并将其与不存在的文件匹配。为什么IIS控制我的应用程序?将Phil Haack的Route Debugger NuGet包添加到项目中,并在页面底部检查路由结果。正如我所说,路由引擎不会启动。IIS立即报告404。将Phil Haack的Route Debugger NuGet包添加到项目中,并在页面底部检查路由结果。正如我所说的,路由引擎不会启动。IIS立即报告404。对不起,您的第一句话是关于开发服务器的,我没有听到。我试过你的方案,一切都很顺利。当我切换到classic pipeline时,我得到了您描述的404错误抱歉,您的第一句话是关于开发服务器的,我没有听到。我试过你的方案,一切都很顺利。当我切换到经典管道时,我得到了您描述的404错误