Asp.net mvc 4 MVC忽略特定路由上的.jpg文件扩展名--是否使用控制器操作?

Asp.net mvc 4 MVC忽略特定路由上的.jpg文件扩展名--是否使用控制器操作?,asp.net-mvc-4,model-view-controller,routes,jpeg,file-extension,Asp.net Mvc 4,Model View Controller,Routes,Jpeg,File Extension,我尝试从特定的url系统提供图像文件,如下所示: mysite/Images/Category/File_Name.extension 我设置了这样一条路线: routes.MapRoute( "ImagesRoute", // Route name "Images/{category}/{file}.jpg", // URL with parameters new { controller = "Posts",

我尝试从特定的url系统提供图像文件,如下所示:

mysite/Images/Category/File_Name.extension

我设置了这样一条路线:

routes.MapRoute( "ImagesRoute", // Route name 
                 "Images/{category}/{file}.jpg", // URL with parameters 
                 new { controller = "Posts", 
                       action = "ViewImage", 
                       category = "", file = "" } // Parameter defaults 
                );
应该映射到我的控制器操作:

public ActionResult ViewImage(string category, string file)
    {
        var dir = Server.MapPath("/Images");
        var imgtitle = file.Replace("_", " ").Replace(".jpg", "");
        var repos = new BlogImagesRepository();
        var guid = repos.FetchImageByCategoryAndTitle(category, imgtitle);
        var path = Path.Combine(dir, category, guid.ImageGuid.ToString());
        return File(path, "image/jpeg");
    }
如果我从路由中删除.jpg扩展名,并请求一个url上没有.jpg扩展名的文件标题(即:Images/MyCategory/My_Image),它会显示得很好。 但是,添加.jpg扩展名会导致404错误--

我假设它正在查找文件,而不是控制器操作

将.jpg添加到路由并不能解决这个问题;我不知道该怎么办,我在谷歌上遇到的问题也不多


如何为.jpg和类似的图像类型执行此操作?我是否必须以某种方式为该特定路径设置忽略?如果是,我该怎么做?该应用程序目前正在VS 2012中运行。

您的回答是正确的,对.jpg的请求没有发送到您的控制器,也没有由IIS的静态文件处理程序处理。您确实不希望忽略,但希望将其传递给ASP.NET运行时。你能找到的大多数互联网搜索都会告诉你在这方面做些什么;但是,这会影响性能,因此最简单的方法可能是在web配置中添加另一个TransferRequestHandler,如下面的MyJpgHandler示例:

  <system.webServer>
    <validation validateIntegratedModeConfiguration="false" />

    <handlers>
      <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
      <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
      <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />    

      <add name="MyJpgHandler" path="Images/*/*.jpg" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />

      <add name="MiniProfiler" path="mini-profiler-resources/*" verb="*" type="System.Web.Routing.UrlRoutingModule" resourceType="Unspecified" preCondition="integratedMode" />
    </handlers>
  </system.webServer>


这应该会导致您预期的行为(假设您没有任何.jpg文件可以作为来自同一url路径的静态内容使用)

您是对的,对.jpg的请求不会发送到您的控制器,也不会由IIS的静态文件处理程序处理。您确实不希望忽略,但希望将其传递给ASP.NET运行时。你能找到的大多数互联网搜索都会告诉你在这方面做些什么;但是,这会影响性能,因此最简单的方法可能是在web配置中添加另一个TransferRequestHandler,如下面的MyJpgHandler示例:

  <system.webServer>
    <validation validateIntegratedModeConfiguration="false" />

    <handlers>
      <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
      <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
      <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />    

      <add name="MyJpgHandler" path="Images/*/*.jpg" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />

      <add name="MiniProfiler" path="mini-profiler-resources/*" verb="*" type="System.Web.Routing.UrlRoutingModule" resourceType="Unspecified" preCondition="integratedMode" />
    </handlers>
  </system.webServer>


这应该会导致您预期的行为(假设您没有任何.jpg文件作为来自同一url路径的静态内容使用)

您可以尝试routes.RouteExistingFiles=true;或者这里有一篇不错的文章,你可以试试routes.RouteExistingFiles=true;或者这里有一篇好文章