gpt4 book ai didi

c# - ASP.NET MVC 4 FilePathResult 和静态文件处理程序

转载 作者:行者123 更新时间:2023-11-30 19:17:38 24 4
gpt4 key购买 nike

我正在为一个 B2B 应用程序构建一个简单的 CMS。用户可以上传/浏览图像,但这些图像存储在 IIS 外部(我的应用程序位于驱动器 C 上,图像存储在驱动器 D 上)。

我的计划是为页面文件创建自定义路由,然后使用 FileController 简单地加载图像

文件 Controller :

public FilePathResult PageFiles(string fileName)
{
var dir = Server.MapPath("/some_protected_area/gallery");
var path = Path.Combine(dir, fileName);
return File(path, "image/jpg");
}

自定义路由:

routes.MapRoute(
null,
"Files/PageFiles/{fileName}",
new { controller = "File", action = "PageFiles", fileName = UrlParameter.Optional },
new[] { "DemoApp.Web.Controllers" }
);

当我访问 http://localhost:58891/Files/PageFiles/image-1.jpg 时,我得到 404。

详细错误信息:

Modeule: IIS Web Core
Notification: MapRequestHandler
Handler: StaticFile
Error code: 0x80070002

当我访问:http://localhost:58891/Files/PageFiles?fileName=image-1.jpg 一切正常,但我不想发送 fileName 在查询字符串中,并且 fileName 必须 包含扩展名(.jpg、.pdf 等)

我能否以某种方式禁用自定义路由的 StaticFile 处理程序?

如有任何帮助,我们将不胜感激!

最佳答案

Can I somehow disable StaticFile handler for custom routes?

当然,只需将以下处理程序添加到<handlers>即可你的 web.config 部分:

<system.webServer>
...
<handlers>
...
<add
name="MyImageHandler"
path="Files/PageFiles/*"
verb="GET"
type="System.Web.Handlers.TransferRequestHandler"
preCondition="integratedMode,runtimeVersionv4.0"
/>
</handlers>
</system.webServer>

这个处理程序的作用是拦截对 Files/PageFiles/* 的所有请求并将它们传递给托管的 ASP.NET 管道进行服务。因此,他们将达到所需的 FilesController .如果没有此处理程序,IIS 会认为该请求是针对静态文件的(因为它以 .jpg 结尾)并完全绕过试图直接为文件提供服务的托管执行。

顺便说一下这个Server.MapPath您在 Controller 操作中使用的功能不适用于存储在您的 Web 应用程序文件夹之外的文件。

备注:您可能会看到其他回复建议您设置 <modules runAllManagedModulesForAllRequests="true" />但我完全建议不要使用这种方法,因为这会使对所有静态文件的所有请求都通过托管管道,这可能会对您的应用程序产生负面的性能影响。仅为您要处理的路由启用此功能效率更高 ( Files/PageFiles/* )。

关于c# - ASP.NET MVC 4 FilePathResult 和静态文件处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16997963/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com