如果在服务器上找到图像,我有一个应该返回图像的操作。如果filename
有效,则一切都按预期工作。但是如果找不到该文件,它总是抛出一个未处理的异常:
在执行当前Web请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪来识别有关异常的起源和位置的信息。
为什么catch块不处理这个异常?
这是我的简化代码:
public ActionResult Users(string filename)
{
try
{
var filePath = Server.MapPath("~/App_Data/uploads/users/" + filename);
var file = File(filePath, "image/jpg", Path.GetFileName(filePath));
return file;
}
catch
{
return Content("FILE NOT FOUND");
}
}
修改
错误:
找不到文件'C:\ Projects \ Extranet \ App_Data \ uploads \ users \ test123.png'。
描述:执行期间发生了未处理的异常 当前的网络请求。请查看堆栈跟踪了解更多信息 有关错误的信息以及它在代码中的起源。
异常详细信息:System.IO.FileNotFoundException:找不到 文件'C:\ Projects \ Extranet \ App_Data \ uploads \ users \ test123.png'。
来源错误:
执行期间生成了未处理的异常 当前的网络请求。有关的来源和位置的信息 可以使用下面的异常堆栈跟踪来识别异常。
堆栈跟踪:
[FileNotFoundException: Could not find file 'C:\Projects\Extranet\App_Data\uploads\users\test123.png'.]
System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) +9726591
System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath) +1142
System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share) +83
System.Web.HttpResponse.TransmitFile(String filename, Int64 offset, Int64 length) +132
System.Web.HttpResponseWrapper.TransmitFile(String filename) +20
System.Web.Mvc.FilePathResult.WriteFile(HttpResponseBase response) +17
System.Web.Mvc.FileResult.ExecuteResult(ControllerContext context) +188
System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult) +13
System.Web.Mvc.<>c__DisplayClass1c.<InvokeActionResultWithFilters>b__19() +23
System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation) +260
System.Web.Mvc.<>c__DisplayClass1e.<InvokeActionResultWithFilters>b__1b() +19
System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext, IList`1 filters, ActionResult actionResult) +177
System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +343
System.Web.Mvc.Controller.ExecuteCore() +116
System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) +97
System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext) +10
System.Web.Mvc.<>c__DisplayClassb.<BeginProcessRequest>b__5() +37
System.Web.Mvc.Async.<>c__DisplayClass1.<MakeVoidDelegate>b__0() +21
System.Web.Mvc.Async.<>c__DisplayClass8`1.<BeginSynchronous>b__7(IAsyncResult _) +12
System.Web.Mvc.Async.WrappedAsyncResult`1.End() +62
System.Web.Mvc.<>c__DisplayClasse.<EndProcessRequest>b__d() +50
System.Web.Mvc.SecurityUtil.<GetCallInAppTrustThunk>b__0(Action f) +7
System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Action action) +22
System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +60
System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +9
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +8967885
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +184
答案 0 :(得分:3)
您尝试检索的文件不存在,因此当MVC处理您的ActionResult时会出现IOException。
这发生在您的控制器方法之外,因此在try-catch块之外。请尝试使用以下代码:
public ActionResult Users(string filename)
{
var filePath = Server.MapPath("~/App_Data/uploads/users/" + filename);
return File.Exists( filePath ) ? File(filePath, "image/jpg", Path.GetFileName(filePath)) : Content( "FILE NOT FOUND" );
}