この拡張メソッドをコードに追加します。
public static Uri UrlOriginal(this HttpRequestBase request)
{
string hostHeader = request.Headers["host"];
return new Uri(string.Format("{0}://{1}{2}",
request.Url.Scheme,
hostHeader,
request.RawUrl));
}
そして、RequestContext.HttpContext.Request
プロパティから実行できます。
ローカルWebサイトにポート80以外のポートを使用するマシンで発生するAsp.Netにバグ(サイドステップされる可能性があります。以下を参照)があります(内部IPサイトが仮想IPの負荷分散を介して公開されている場合、大きな問題になります)およびポートは公開ルールに内部的に使用されます)。これにより、Asp.Netは常にAbsoluteUri
プロパティにポートを追加します-元のリクエストがポートを使用しない場合でも。
このコードは、ロードバランシングなどが行われる前に、返されるURLがブラウザーが最初に要求したURL (ホストヘッダーに含まれるため、ポートを含む)と常に等しいことを保証します。
少なくとも、それは私たちの(かなり複雑です!)環境で行います:)
その間にホストヘッダーを書き換えるファンキーなプロキシがある場合、これも機能しません。
2013年7月30日更新
下のコメントで@KevinJonesで述べたように-設定私はここで報告されている次のセクションで言及:http://msdn.microsoft.com/en-us/library/hh975440.aspx
試してみたがうまくいかなかったと言わざるを得ないが、それはタイプミスか何かを作っているだけかもしれない。
2012年7月9日更新
私は少し前にこれに出くわしました、そしてこの答えを更新するつもりでした、しかし決してしませんでした。この回答について賛成票が入ってきたとき、今すぐやるべきだと思いました。
私がAsp.Netで言及している「バグ」は、明らかに文書化されていないappSettings値-と呼ばれる'aspnet:UseHostHeaderForRequest'
- で制御できます。
<appSettings>
<add key="aspnet:UseHostHeaderForRequest" value="true" />
</appSettings>
HttpRequest.Url
ILSpyで見ているときにこれに遭遇しました- --->
そのILSpyビューからの次のコピー/貼り付けの左側に示されています:
public Uri Url
{
get
{
if (this._url == null && this._wr != null)
{
string text = this.QueryStringText;
if (!string.IsNullOrEmpty(text))
{
text = "?" + HttpEncoder.CollapsePercentUFromStringInternal(text,
this.QueryStringEncoding);
}
---> if (AppSettings.UseHostHeaderForRequestUrl)
{
string knownRequestHeader = this._wr.GetKnownRequestHeader(28);
try
{
if (!string.IsNullOrEmpty(knownRequestHeader))
{
this._url = new Uri(string.Concat(new string[]
{
this._wr.GetProtocol(),
"://",
knownRequestHeader,
this.Path,
text
}));
}
}
catch (UriFormatException)
{ }
}
if (this._url == null) { /* build from server name and port */
...
私は個人的には使用していません-文書化されていないため、固執することは保証されていません-しかし、上で述べたのと同じことをするかもしれません。検索結果の関連性を高めるため、そしてこれを発見したと思われる他の誰かを認めるために、この設定はニック・エーブスのツイッターでも言及されています'aspnet:UseHostHeaderForRequest'