2

1 つの B2B アプリケーション用のシンプルな CMS を構築しています。ユーザーは画像をアップロード/閲覧できますが、これらの画像は IIS の外部に保存されます (私のアプリケーションはドライブ C にあり、画像はドライブ D に保存されます)。

私の計画は、ページ ファイルのカスタム ルートを作成し、次を使用して画像をロードすることです。FileController

ファイルコントローラー:

public FilePathResult PageFiles(string fileName)
{
    var dir = Server.MapPath("/some_protected_area/gallery");
    var path = Path.Combine(dir, fileName);
    return File(path, "image/jpg");
}

カスタム ルート:

routes.MapRoute(
    null,
    "Files/PageFiles/{fileName}",
    new { controller = "File", action = "PageFiles", fileName = UrlParameter.Optional },
    new[] { "DemoApp.Web.Controllers" }
    );

アクセスするhttp://localhost:58891/Files/PageFiles/image-1.jpgと404になります。

詳細なエラー情報:

Modeule: IIS Web Core
Notification: MapRequestHandler
Handler: StaticFile
Error code: 0x80070002

アクセス時:すべて正常に動作しますが、クエリ文字列http://localhost:58891/Files/PageFiles?fileName=image-1.jpgを送信したくないため、拡張子 (.jpg、.pdf など) を含める必要があります。fileNamefileName

StaticFileどうにかしてカスタム ルートのハンドラを無効にすることはできますか?

どんな助けでも大歓迎です!

4

2 に答える 2

8

カスタム ルートの StaticFile ハンドラを何らかの方法で無効にすることはできますか?

もちろん、<handlers>web.config のセクションに次のハンドラーを追加するだけです。

<system.webServer>
    ...
    <handlers>
        ...
        <add 
            name="MyImageHandler" 
            path="Files/PageFiles/*" 
            verb="GET" 
            type="System.Web.Handlers.TransferRequestHandler" 
            preCondition="integratedMode,runtimeVersionv4.0" 
        />
    </handlers>
</system.webServer>

このハンドラーが行うことは、すべての要求をインターセプトFiles/PageFiles/*し、マネージド ASP.NET パイプラインに渡してサービスを提供することです。したがって、それらは目的のFilesController. このハンドラーがないと、IIS は要求が静的ファイルに対するものであると見なし ( で終わるため.jpg)、マネージド実行を完全にバイパスして、ファイルを直接提供しようとします。

ちなみに、コントローラー アクションで使用しているこのServer.MapPath関数は、Web アプリケーション フォルダーの外部に保存されているファイルに対しては機能しません。

備考: 設定することを提案する他の応答が表示される場合がありますが<modules runAllManagedModulesForAllRequests="true" />、このアプローチはすべての静的ファイルへのすべての要求をマネージド パイプラインを通過させ、アプリケーションのパフォーマンスに悪影響を及ぼす可能性があるため、完全に推奨しません。処理したいルートに対してのみこれを有効にする方がはるかに効率的です ( Files/PageFiles/*)。

于 2013-06-08T09:34:30.467 に答える
2

ここで数日前に同様のことを答えましたが、基本的には:

パスにはワイルドカードを使用する必要があります{*fileName}:

routes.MapRoute(
    null,
    "Files/PageFiles/{*fileName}",
    new { controller = "File", action = "PageFiles", fileName = UrlParameter.Optional },
    new[] { "DemoApp.Web.Controllers" }
    );

そして、 StaticFile ハンドラーをバイパスするには、次のように Web 構成を変更する必要があります。

<system.webServer>
  <modules runAllManagedModulesForAllRequests="true" />

TransferRequestHandlerところで、有効なアプローチであるの代わりに使用することを示唆する回答がいくつかありますrunAllManagedModulesForAllRequestsが、いずれにしてもルートを修正する必要があります。

于 2013-06-08T09:34:22.987 に答える