13

私の Web アプリケーションには、次のようなルートがあります。

routeCollection.MapRoute(
    "AdfsMetadata",                                                // name
    "FederationMetadata/2007-06/FederationMetadata.xml",           // url
    new { controller = "AdfsController", action = "MetaData" });   // defaults

このルートの背後にある考え方は、ホスト名を指定するだけでこの時点で AD FS メタデータを検索する Microsoft AD FS サーバー (2.0+) との連携を改善することでした。MVC3 ではすべて正常に動作しました。しかし、最近プロジェクトを MVC4 にアップグレードしたところ、この URL の呼び出しで 404 が発生しました。エラー ページに記載されているハンドラーはStaticFileで、物理パスはD:\path\to\my\project\FederationMetadata\2007-06\FederationMetadata.xmlです。MVCまたはASP.NETは、静的ファイルの要求である必要があると「考え」、ファイルを探していると思いますが、ファイルではありません。データは動的に生成されます。そのため、URL をコントローラー アクションにルーティングしました。問題は、Phil Haack による Route Debugger でさえ動作しないことです。これは単なる 404 であり、IIS が存在しない物理ファイルにアクセスしようとしたこと以外の情報はありません。

誰かがこれに対する解決策を持っていますか? この URL をコントローラー アクションにルーティングしたいだけです。

PS:原因が MVC4 へのアップグレードであったことを100%確信しているわけではありません。アップグレードとほぼ同時にエラーが発生したため、推測であり、MVC3 を使用している別のプロジェクトでも同じルートが機能します。

編集:

ControllerFactory完全なクラス名 (AdfsControllerの代わりにAdfs)が必要なカスタムがあるControllerため、この場合は接尾辞が正しいです。

4

2 に答える 2

17

ノードの<handlers>セクションに次を追加します。<system.webServer>

<add 
    name="AdfsMetadata" 
    path="/FederationMetadata/2007-06/FederationMetadata.xml" 
    verb="GET" 
    type="System.Web.Handlers.TransferRequestHandler" 
    preCondition="integratedMode,runtimeVersionv4.0" />

これにより、IIS は、指定された URL への GET 要求をマネージ パイプラインで処理し、静的ファイルとは見なさず、IIS によって直接処理されるように指示されます。

完全なクラス名 (Adfs ではなく AdfsController) を必要とするカスタム ControllerFactory があるため、この場合は接尾辞 Controller が正しいです。

これを再確認してください。Controllerルート定義でサフィックスの有無を試してください。

于 2013-01-14T22:25:42.533 に答える
2

デフォルトでは、IIS は ASP パイプラインに入ることなく、そのファイルを静的として提供しています。.xml 拡張子を持たないようにルートを変更できますか (これは、少なくとも特定の要件がある必要はありません)。

次のようにルートを指定できます。

routeCollection.MapRoute(
"AdfsMetadata",                                                // name
"FederationMetadata/2007-06/FederationMetadata",               // url
new { controller = "AdfsController", action = "MetaData" });   // defaults

他の解決策は、web.configに追加することです

<modules runAllManagedModulesForAllRequests="true">

ただし、IIS がすべての静的ファイルを提供するのを停止するため、これはできるだけ避けることをお勧めします。

編集最後の試行...その特定のパスのカスタムhttpハンドラーが機能します。この投稿は、画像に関する問題のみに似ています(「より良い:カスタムHttpHandlers」セクションを探してください)

于 2013-01-14T22:05:35.557 に答える