私はかなりそれがすべてを説明するリンクを見つけました:http://social.msdn.microsoft.com/Forums/en-AU/windowsazuredevelopment/thread/87c729e8-094c-4578-b9d1-9c8ff7311577。
アプリケーションでは、Request.Url
が実際のページを特定するために使用されていましたが、URLを作成して他の場所にルーティングすることができました。 http://somedomain.com/page.aspx?var=1でWebアプリケーションを閲覧した人は、これをRequest.Urlパラメータに設定するため、これはIISでうまく機能しました。私のlocalhostの例では、これは単にhttp://127.0.0.1:8080/page.aspx?var=1です。
Azureでは、ロードバランサは実際にこのポートでこのIPをリッスンするように設定されたものです。ロードバランサは、別のポートで実行されているインスタンスの1つに要求を転送します。これにより、Request.Urlプロパティはhttp://127.0.0.1:8081/page.aspx?var=1になります。このプロパティは、Server.Transfer呼び出しで使用されるURLを構築するために使用されていたため、この特定のインスタンスのポート8080ではなく、元のポート8080に構築する必要があるため、要求が正しくありません。
私はRequest.Urlプロパティを模倣しようとしましたが、元の要求にマップさせてください。 Request.Urlのコードは少し奇妙です:
public Uri Url {
get {
if (this._url == (Uri) null && this._wr != null) {
string s = this.QueryStringText;
if (!string.IsNullOrEmpty(s))
s = "?" + HttpEncoder.CollapsePercentUFromStringInternal(s, this.QueryStringEncoding);
if (AppSettings.UseHostHeaderForRequestUrl) {
string knownRequestHeader = this._wr.GetKnownRequestHeader(28);
try {
if (!string.IsNullOrEmpty(knownRequestHeader))
this._url = new Uri(this._wr.GetProtocol() + "://" + knownRequestHeader + this.Path + s);
}
catch (UriFormatException ex){}
}
if (this._url == (Uri) null) {
string str = this._wr.GetServerName();
if (str.IndexOf(':') >= 0 && (int) str[0] != 91)
str = "[" + str + "]";
this._url = new Uri(this._wr.GetProtocol() + "://" + str + ":" + this._wr.GetLocalPortAsString() + this.Path + s);
}
}
return this._url;
}
}
私はHttpWorkerRequest.GetKnownRequestHeader(28)
上の任意の情報を見つけることができません。 MSDNは役に立ちません。
指定されたインデックスに対応する標準HTTP要求ヘッダーを返します。
大丈夫です。インデックスとは何ですか?このメソッドの逆コンパイルされたコードは、(string)null
を返します。だから、本当に、これは何もしないと思います。
とにかく。
new Uri(HttpContext.Current.Request.Url.Scheme + "://" + HttpContext.Current.Request.Headers[ "Host" ] + HttpContext.Current.Request.Url.PathAndQuery)
HttpContext.Current.Request.Headers[ "Host" ]
は、元の要求のホスト名を返します:ポートを私はこれでプロパティを交換することになりました。ホストは必須のヘッダーなので、これは良いはずです。うまくいけばこれを使って、以前の振る舞いのすべての一貫性を提供し、WebアプリケーションをAzureで機能させることができます。