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 に答える