2012-03-05 31 views
2

Azureで使用するWebアプリケーションを移行しようとしています。このアプリケーションは、標準のIISでうまく動作します。ローカルWebアプリケーションをテストするために、Azureのエミュレータを使用する場合は、すべてのポストバックがAzureロードバランサにより、ポストバック時に400エラー "無効なホスト名"が発生する

不正な要求につながる - 無効なホスト名

HTTPエラー400要求のホスト名は無効です。

私は詳細情報を収集する場所を失っています。これまで私は試しました:

  • アプリケーションのデバッグ。ブレークポイントが最初のページの読み込みでヒットしたことを確認できるので、デバッグは間違いなく機能しています。ポストバックが発生すると、デバッガは例外をキャッチしません。

  • イベントビューアで見る。この問題のログは、アプリケーションログまたはシステムWindowsログのいずれにもありません。

  • Azureエミュレータで作成されたIISバインディングをチェックアウトしました。 IPアドレス127.255.0.0、ポート8081にバインディングが作成されていることに気付きました。このIPアドレスバインディングを127.0.0.1に変更した場合、ポストバックは正しく再び機能します。これがロードバランシングの結果であると私が信じている理由です:私がロードバランサをバイパスすると、私たちは再びビジネスに入ります。明らかに、これは永続的な解決策ではありません。

この時点ではわかりません。ロードバランサに関する情報やその動作方法がわかりません。もっと情報を探すことができる場所はありますか?このWebアプリケーションは、例外がスローされていないように見えるにもかかわらず、エラーの原因となる特定の処理を行う必要があります。これは何が原因でしょうか?

答えて

2

私はかなりそれがすべてを説明するリンクを見つけました: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で機能させることができます。

関連する問題