c# - ASP.NET MVC Controller 处理文件下载

标签 c# asp.net asp.net-mvc

我在 MVC 5 中构建了一个 Controller 来处理受登录保护的文件下载。 Controller 在没有 pdf 扩展名的情况下工作正常,即/media/1001/secretpdffile 之类的路径仅在用户登录时才会在 App_Data/media/1001/secretpdffile.pdf 下载文件。

我想在路径上添加 pdf 扩展名,但是一旦我添加它(当然也删除了我在 Controller 中添加的 pdf),我就收到了 404 错误。

这是我的路线

routes.MapRoute(
    name: "Media",
    url: "media/{mediaid}/{filename}",
    defaults: new { controller = "Media", action = "Get" }
);

我已经看到很多地方试图通过 或在 web.config 中使用 System.Web.Handlers.TransferRequestHandler 设置路径来解决这个问题,但我没有祝你好运。

最佳答案

这是 IIS 的正常行为,称为 request filtering . 基本上它不会向 ASP.MVC 发送请求,如果有一个点,因为它会认为你想要一个文件,所以它会在服务器上寻找文件并返回 404 错误,因为它找不到它。

您可以在这里找到一些解决方案:https://stackoverflow.com/a/12151501/1681023

或者您可以在 IIS 上编辑您的配置,禁用第一个链接显示的功能。

或者您可以通过替换为 %2E 来转义您的点,这可能是最简单的方法。

附带说明一下,禁用请求过滤功能时要小心,显然,如果您为 https://stackoverflow.com/media/* 禁用它,您将无法访问任何来自 http 请求的名为 media 的文件夹中的资源,因此,如果您想在您的网站上使用一些图像、css 或 js,请不要为您的所有应用程序或服务器禁用它。

关于c# - ASP.NET MVC Controller 处理文件下载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27987546/

相关文章:

c# - 在 ASP.NET Web API 中使用多个 Get 方法进行路由

asp.net - 避免 SQL Server 中的盲 SQL 注入(inject)漏洞的最佳实践 - ASP.Net

javascript - 如何从表格的不同行获取下拉列表的 id?

ASP.NET RangeValidator 与 MaximumValue 的怪异

c# - 如何使用 Unity 模拟瓶子内的液体?

c# - 比较两个字符串 C#?

c# - 我可以在 VS2010 的 VS2012 中使用静态分析吗?

sql - Azure SQL 数据库在本地运行时可以工作,但在发布到 Azure 时则无法工作

c# - 在 C# 中将 DateTime 日期和字符串时间组合成单个 DateTime

c# - Good Practice mvc 条件按钮及其代码