我正在尝试从特定的 url 系统提供图像文件,如下所示:
我的网站/图像/类别/File_Name.扩展名
我设置了一条这样的路线:
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 错误 -
The resource you are looking for has been removed, had its name changed, or is temporarily unavailable.
我假设它正在寻找文件,而不是控制器操作。
将.jpg添加到路由并不能解决此问题;我不确定该怎么做,我的谷歌运气也不是很高,我在这里看到的类似问题。
如何为.jpg和类似的图像类型执行此操作? 我是否必须以某种方式为该特定路径设置忽略? 如果是这样,我该怎么做? 该应用程序目前刚刚通过VS 2012运行。
您是对的,因为对.jpg的请求不会发送到控制器并由 IIS 的静态文件处理程序处理。您并不真正想要忽略,但您希望将其传递到 ASP.NET 运行时。你会发现的大多数互联网搜索都会告诉你添加 RunAllManagedModulesForAllRequests 或这方面的内容;但是,这会影响性能,因此最简单的方法可能是在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.NETFrameworkv4.0.30319aspnet_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.NETFramework64v4.0.30319aspnet_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 路径的静态内容提供)