0

我試圖從特定的URL系統服務映像文件,就像這樣:MVC忽略某些路徑上的.jpg文件擴展名 - 使用Controller操作?

的mysite /圖片/分類/ 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擴展,並要求文件標題,而不.jpg的擴展名(即:Images/MyCategory/My_Image),它顯示得很好。 然而,加入jpg擴展導致404 error--

The resource you are looking for has been removed, had its name changed, or is temporarily unavailable. 

我認爲它看起來不是控制器行動的文件。

將.jpg添加到路徑中並未解決此問題;我不確定要做什麼,而且我在這裏看到類似的問題,所以我的谷歌運氣不是很高。

我該怎麼做.jpg和類似的圖像類型?我是否必須以某種方式設置對特定路徑的忽略?如果是這樣,我該怎麼做呢?目前該應用程序正在通過VS 2012。

+0

你可以嘗試routes.RouteExistingFiles = true;或或這裏是一個不錯的文章http://www.codeproject.com/Questions/216044/Period-dot-in-ASP-NET-MVC-Route – HaBo

回答

3

你說的對.jpg的請求沒有被髮送到你的控制器,而是由IIS的靜態文件處理程序處理。你並不真的想要忽略,但是你想把它傳遞給ASP.NET運行時。你會發現大多數互聯網搜索會告訴你添加RunAllManagedModulesForAllRequests或其他方面的東西,然而,這對性能的影響,所以要做到這一點最簡單的方法可能是添加其他TransferRequestHandler在你的web配置,如下面的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路徑的靜態內容)

相關問題