在 MVC4 路由中使用点“.”字符

本文关键字:字符 MVC4 路由 | 更新日期: 2023-09-27 18:32:31

我目前正在提供来自数据库表的图像,这些图像都具有相同的文件类型。我希望在路线中使用点"."字符,但这样做没有任何成功。据我了解,ISAPI 处理程序可能会导致与此相关的问题。我只是不确定我将如何添加和排除以允许 ASP.NET 处理此路由。

routes.MapRoute(
    name: "ImageUrl",
    url: "Image/{action}/{id}.png",
    defaults: new { controller = "Image" }
);

在 MVC4 路由中使用点“.”字符

会收到 404 错误,因为 IIS 配置中没有映射到路径*.png的特定托管处理程序。所以所有对Image/*.png路径的请求都被StaticFile模块(StaticFileModule, DefaultDocumentModule, DirectoryListingModule)截获,这些模块找不到请求的文件。

您可以通过在 web.config 中配置应用程序来解决此问题。

第一个选项是将runAllManagedModulesForAllRequests="true"属性添加到configuration/system.webServer/modules元素。它应该看起来像这样:

    <modules runAllManagedModulesForAllRequests="true" />

注意:但我强烈建议不要这样做。详细了解可能的性能问题。

因此,第二个(也是更好的)选项是注册 ASP.NET ISAPI 以处理您对Image/*.png路径的请求:

<system.webServer>
  <handlers>
    <add name="ImageMVCHandler-ISAPI-4.0_32bit" path="image/*.png" verb="GET,HEAD" modules="IsapiModule" scriptProcessor="%windir%'Microsoft.NET'Framework'v4.0.30319'aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
    <add name="ImageMVCHandler-ISAPI-4.0_64bit" path="image/*.png" verb="GET,HEAD" modules="IsapiModule" scriptProcessor="%windir%'Microsoft.NET'Framework64'v4.0.30319'aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
    <add name="ImageMVCHandler-Integrated-4.0" path="image/*.png" verb="GET,HEAD" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
  </handlers>
</system.webServer>