我在控制器方法中有這段代碼;try{ return PhysicalFile("c:\temp\my-non-existing-file.txt", "text/plain");}catch (FileNotFoundException){ return NotFound();}但是,在這種情況下不運行 catch 子句,而是將 a500 Internal Server Error返回給瀏覽器。讓開發人員錯誤頁面處于活動狀態,它表明FileNotFoundException確實拋出了 a,但調用堆棧顯示它來自中間件。System.IO.FileNotFoundException: Could not find file 'c:\temp\my-non-existing-file.txt'.File name: 'c:\temp\my-non-existing-file.txt' at System.IO.FileInfo.get_Length() at Microsoft.AspNetCore.Mvc.Infrastructure.PhysicalFileResultExecutor.GetFileInfo(String path) at Microsoft.AspNetCore.Mvc.Infrastructure.PhysicalFileResultExecutor.ExecuteAsync(ActionContext context, PhysicalFileResult result) at Microsoft.AspNetCore.Mvc.PhysicalFileResult.ExecuteResultAsync(ActionContext context) at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeResultAsync(IActionResult result) at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeNextResultFilterAsync[TFilter,TFilterAsync]() at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow(ResultExecutedContext context) at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.ResultNext[TFilter,TFilterAsync](State& next, Scope& scope, Object& state, Boolean& isCompleted) at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeResultFilters() at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeNextResourceFilter() at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow(ResourceExecutedContext context) at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted) at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeFilterPipelineAsync()有人可以解釋如何正確處理這種情況并返回404 Not Found嗎?更新:添加了完整的堆棧(帶有一些名稱清理)
1 回答

胡說叔叔
TA貢獻1804條經驗 獲得超8個贊
文件直到稍后才解析,當響應被假脫機時,這發生在您的操作已經退出之后。因此,您無法在此處捕獲該異常。您可能可以使用自定義中間件或異常處理程序來做一些事情,但老實說,為什么不直接執行以下操作:
var filename = "c:\temp\my-non-existing-file.txt";
if (System.IO.File.Exists(filename))
{
return PhysicalFile(filename, "text/plain");
}
else
{
return NotFound();
}
主動檢查條件總是比依賴捕獲異常要好。過度依賴異常處理會降低您的應用程序性能。
- 1 回答
- 0 關注
- 214 瀏覽
添加回答
舉報
0/150
提交
取消