19

私は数時間グーグルでいじくり回してきましたが、実際にはあまり進歩していないので、ここの誰かが助けてくれることを願っています.

サードパーティのコンポーネントによって処理される特定のパスへのすべてのリクエストを取得しようとしています。

編集そして、正常に動作するには、他のすべてのパスへのすべてのリクエストが必要です。

次のようなワイルドカード マッピングを持つルート ハンドラを使用しています。

routes.Add(new Route("pathiwant/{*EverythingElse}", new MyRouteHandler()));

すべての従来のルートはハンドラーに正しく転送され、ハンドラーはサードパーティ コンポーネントに適切に転送されます。静的ファイル (.html、.txt など) をヒットすると、ハンドラーではなく StaticFile ハンドラーによって取得されるため、次のように StaticFile ハンドラーをオフにしようとしています (簡略化):

<system.webServer>
  <handlers>
    <remove name="StaticFile"/>
  </handlers>
</system.webServer>

これにより、StaticFile ハンドラーがオフになりますが、MVC はまだルートを選択しません。

独自のハンドラーを作成して ASP 要求スタックに挿入する方法に頼りたくないのですが、これを行うには MVC に適した方法があるはずです。

何かご意見は?ありがとう。

4

2 に答える 2

17

ここにはいくつかのオプションがあります。

http://www.hanselman.com/blog/BackToBasicsDynamicImageGenerationASPNETControllersRoutingIHttpHandlersAndRunAllManagedModulesForAllRequests.aspx

すべてのリクエストがasp.netパイプを介して実行されることが本当に必要な場合は、必要です。

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

アップデート

別のオプション、特に静的ハンドラーをバイパスする必要がサイトのサブセットに制限されている場合は、次を使用することです。

  <add name="ApiURIs-ISAPI-Integrated-4.0"
     path="/subdirectory/*"
     verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS"
     type="System.Web.Handlers.TransferRequestHandler"
     preCondition="integratedMode,runtimeVersionv4.0" />

mvc サイトでほとんどの静的ファイルがよく知られているいくつかのディレクトリからどのように処理されるかを考えると、これはより良いオプションです。

于 2012-06-29T08:06:41.583 に答える
3

これに対する最善の解決策は、おそらくURL Rewriterを使用して、元の URL からのリクエストを MVC に適した別の URL にプロキシすることです。

たとえば、データベースから提供されるコンテンツの相対 URL を自動的にロードできるようにする必要があるとします。

RewriteRule ^/load/(\d+)/rel(\?.*)? -   [L]
RewriteRule ^/load/(\d+)/(.*)$  /load/$1/rel?path=$2    [P,QSA,L,NC]

これらのルールにより、2 つの MVC ルートを設定できます。

routes.MapRoute(
    "Load Item",
    "load/{itemId}",
    new { controller = "Load", action = "Index" }
    );

routes.MapRoute(
    "Load Relative Item",
    "load/{itemId}/rel",   //?path=
    new { controller = "Load", action = "Relative" }
    );

そして、あなたのアクションメソッドは簡単です:

 public ActionResult Index(int itemId) { ... }

 public FileStreamResult Relative(int itemId, string path) { ... }

最初の書き換えルールは、/rel を含むパスが書き換えられないようにするためにあります。彼らはすでに最終的な形になっています。2 番目の書き換えルールは、要求を (リダイレクトする代わりに) プロキシします。

例えば

/load/1234/file.xml

になる

/load/1234/rel?path=file.xml

クライアント リダイレクトを実行する代わりにリクエストをプロキシすると、ネストされた相対パスも機能します (エンド ユーザーから秘密のソースを隠します)。

于 2013-04-26T10:00:03.560 に答える