2

我有一个动作,如果在服务器上找到它应该返回一个图像。如果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”。

说明:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息:System.IO.FileNotFoundException:找不到文件“C:\Projects\Extranet\App_Data\uploads\users\test123.png”。

源错误:

在执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪来识别有关异常起源和位置的信息。

堆栈跟踪:

[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
4

1 回答 1

4

您尝试检索的文件不存在,因此当 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" );
}
于 2012-05-30T14:31:52.037 回答