私がこれを投稿した理由の一部は、回避策を見つけたからでもあります。
これが将来誰かに役立つことを願っています:D
回避策
回避策は非常に簡単で、非常に優れています。
サイトのどの部分で動的パラメーターを使用する必要があるか (したがって、動的なパスと長さが必要になるか) がわかっているため、ASP.NET に到達する前にインターセプトすることで、この長い URL を ASP.NET ルーティングに送信することを回避できます。
IIS7 Url Rewriting (または同等の書き換えモジュール) を入力します。
次のようなルールを設定します。
<rewrite>
<rules>
<rule>
<rule name="Remove Category Request Parameters From Url">
<match url="^category/(\d+)/{0,1}(.*)$" />
<action type="Rewrite" url="category/{R:1}" />
</rule>
</rules>
</rewrite>
基本的に、私たちが行っていることは、正しいルートを下流に呼び出すことができるように十分なパスを保持することです。ハッキングしている URL パスの残りの部分。
URL の残りの部分はどこに行きますか?
書き換えルールが起動されると、IIS7 URL 書き換えモジュールは自動的にこのヘッダーを要求に設定します。
HTTP_X_ORIGINAL_URL
パスを調べる代わりに、動的パスを解析するアプリの部分で、ダウンストリーム:
HttpContext.Request.Url.PathAndQuery
代わりにそのヘッダーを確認します。
HttpContext.Request.ServerVariables["HTTP_X_ORIGINAL_URL"]
問題は解決しました...ほぼ!
スナッグス
ヘッダーへのアクセス
知っておく必要がある場合、IIS7 Rewrite Module ヘッダーにアクセスするには、次の 2 つの方法があります。
HttpContext.Request.ServerVariables["HTTP_X_ORIGINAL_URL"]
また
HttpContext.Request.Headers["X-ORIGINAL-URL"]
相対パスの修正
また、上記の設定では、すべての相対パス (「~」で定義された URL) が壊れていることに気付くでしょう。
これには、ASP.NET MVCHtmlHelper
とUrlHelper
メソッド ( などUrl.Route("Bla")
) で定義された URL が含まれます。
これは、ASP.NET MVC コードへのアクセスが優れているところです。
このSystem.Web.Mvc.PathHelper.GenerateClientUrlInternal()
メソッドでは、同じ URL 書き換えモジュール ヘッダーが存在するかどうかを確認するためのチェックが行われます (上記を参照)。
// we only want to manipulate the path if URL rewriting is active, else we risk breaking the generated URL
NameValueCollection serverVars = httpContext.Request.ServerVariables;
bool urlRewriterIsEnabled = (serverVars != null && serverVars[_urlRewriterServerVar] != null);
if (!urlRewriterIsEnabled) {
return contentPath;
}
存在する場合、元の URL を保持するために何らかの作業が行われます。
私たちの場合、「通常の」方法で URL 書き換えを使用していないため、このプロセスを短縮したいと考えています。
元の URL のコンテキストで相対パスを考慮したくないため、URL の書き換えが発生していないふりをしたいと考えています。
私が考えることができる最も簡単なハックは、そのサーバー変数を完全に削除することでした。そのため、ASP.NET MVC はそれを見つけられません。
protected void Application_BeginRequest()
{
string iis7UrlRewriteServerVariable = "HTTP_X_ORIGINAL_URL";
string headerValue = Request.ServerVariables[iis7UrlRewriteServerVariable];
if (String.IsNullOrEmpty(headerValue) == false)
{
Request.ServerVariables.Remove(iis7UrlRewriteServerVariable);
Context.Items.Add(iis7UrlRewriteServerVariable, headerValue);
}
}
(上記の方法では、 からヘッダーを削除してRequest.ServerVariables
いますが、まだ保持していて、 に隠していることに注意してContext.Items
ください。この理由は、後で要求パイプでヘッダー値にアクセスする必要があるためです。)
お役に立てれば!