簡體   English   中英

ASP.NET MVC控制器處理文件下載

[英]ASP.NET MVC controller handling file downloads

我在MVC 5中構建了一個控制器來處理受登錄保護的文件下載。 控制器在沒有pdf擴展名的情況下可以正常工作,即,僅當用戶登錄時,/ media / 1001 / secretpdffile之類的路徑才會在App_Data / media / 1001 / secretpdffile.pdf中下載文件。

我想在路徑上使用pdf擴展名,但是一旦添加它(當然也刪除了我在控制器中添加的pdf),就會出現404錯誤。

這是我的路線

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

我已經看到很多地方嘗試使用<httpRuntime RelaxedUrlToFileSystemMapping =“ true” />或通過在web.config中使用System.Web.Handlers.TransferRequestHandler設置路徑來解決此問題,但是我對此沒有任何運氣。

這是IIS的正常行為,稱為請求過濾 基本上,如果有一個點,它將不會將請求發送到ASP.MVC,因為它會認為您需要一個文件,因此它將在服務器上查找該文件並返回404錯誤,因為找不到它。

您可以在此處找到一些解決方案: https : //stackoverflow.com/a/12151501/1681023

或者,您可以禁用第一個鏈接顯示等功能,在IIS上編輯配置。

或者您可以通過替換%2E來逃脫點,這可能是最簡單的方法。

附帶一提,請小心禁用請求過濾功能,顯然,如果您對https://stackoverflow.com/media/*禁用了請求過濾功能,則您將無法從http請求訪問名為media的文件夾中的任何資源。 ,因此,如果您要在網站上顯示一些圖片,css或js,請不要對所有應用或服務器都禁用它。

我將路由URL更改為“ media / {mediaid} / {filename}。{format}”,並更新了控制器以期望使用format參數。

我還必須將此添加到web.config

  <add name="ManagedFileWithExtension" path="/media/*/*.*" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM