参照されている投稿と同じ問題があり(ExtensionlessUrlHandlerが原因でWebAPIの書き換えルールが失敗します)、問題を回避するために何度か試行しましたが、成功しました。私が今立ち往生しているのは次のとおりです。
バックグラウンド:
- IIS7、リライトモジュールおよびARR(私はリライトおよびARRの初心者です)
- ASP.Net MVC4(www.foo.com)を使用してWebフロントをホストしているSite1
- ASP.Net MVC4(svc.foo.com)を使用してWebAPIをホストしているSite2
- 両方のサイトのコードとサイト構成を完全に制御できます
ゴール:
- www.foo.com/svc/*をsvc.foo.com/api/*に書き換えます
働く:
- www.foo.com/svc/somecontroller/0はsvc.foo.com/api/somecontroller/0に正常にマップされます
動作しない:
- www.foo.com/svc/somecontroller?id=0
- 失敗したリクエストの追跡をオンにしたところ、書き換えモジュールがURLを書き換えているようですが、何らかの理由でsvc.foo.comにリクエストが送信されません。
詳細:
- 参照された投稿の問題を回避するために、webapiへのすべての呼び出しの最後に「.s」を追加します(これを実行できるように完全に制御できます-理想的ではありませんが、今のところこれで問題なく動作する必要があります)
- QSがない場合:www.foo.com/svc/somecontroller/0はwww.foo.com/svc/somecontroller.sになります
- QSの場合:www.foo.com/svc/somecontroller?id=0はwww.foo.com/svc/somecontroller?id=0.sになります
- 次に、書き換えルールを使用して「.s」を削除し、svc.foo.com / api / somecontroller/0またはsvc.foo.com/api/somecontroller?id=0を実際に呼び出します。
クエリ文字列形式を使用すると、これが機能しない理由を一生理解できません。
ルールの書き換え:
< rule name="Route requests with QS" stopProcessing="true">
< match url="^svc/(.*)" />
< conditions>
< add input="{QUERY_STRING}" pattern="(.*).s" />
< / conditions>
< action type="Rewrite" url="http://svc.foo.com/api/{R:1}?{C:1}" appendQueryString="false" logRewrittenUrl="true" />
< / rule>
< rule name="Route the requests without QS" stopProcessing="true">
< match url="^svc/(.*).s" />
< conditions>
< add input="{CACHE_URL}" pattern="^(https?)://" />
< / conditions>
< action type="Rewrite" url="{C:1}://svc.foo.com/api/{R:1}" logRewrittenUrl="true" />
< / rule>
前もって感謝します!