ロードバランサー (bigip/f5) 環境では、Web サイトを asp.net 4.0 で実行するように設定した後、WCF サービスが機能しません。JavaScript プロキシ リクエストは、asp.net 4 で https ではなく http として送信され、JS で「アクセスが拒否されました」というエラーが発生します。
以前のバージョンのasp.netでも問題なく同じように動作します。何か案が??
ロードバランサー (bigip/f5) 環境では、Web サイトを asp.net 4.0 で実行するように設定した後、WCF サービスが機能しません。JavaScript プロキシ リクエストは、asp.net 4 で https ではなく http として送信され、JS で「アクセスが拒否されました」というエラーが発生します。
以前のバージョンのasp.netでも問題なく同じように動作します。何か案が??
これはConnect で Microsoft に報告された .NET4 のリグレッションです(投票してください) が、Microsoft からはまだ修正されていません。今のところ、戻る途中でコンテンツのプロトコルを書き換える F5 ルールをいくつか書きました。最悪ですが、アプリ レベルで何かを変更する必要がなくなります (カスタム HttpModule の作成など)。
最初に、リクエストを処理する必要があるかどうかを確認します。そうである場合は、クライアントから Accept-Encoding ヘッダーにフラグを立てて削除します。
when HTTP_REQUEST
{
set normalizedPath [string toupper [HTTP::path]]
if {$normalizedPath ends_with ".SVC/JS" || $normalizedPath ends_with ".SVC/JSDEBUG"}
{
set needToFixSvcReference 1
if {[HTTP::header exists "Accept-Encoding"]}
{
HTTP::header remove "Accept-Encoding"
}
}
else
{
set needToFixSvcReference 0
}
}
次に、応答処理のために、応答をいじる必要があるかどうかを確認し、そうである場合はコンテンツを収集します。
when HTTP_RESPONSE {
if($needToFixSvcReference equals 1)
{
# grab the response
if { [HTTP::header exists "Content-Length"] }
{
set content_length [HTTP::header "Content-Length"]
}
else
{
set content_length 20000
}
if { $content_length > 0 }
{
HTTP::collect $content_length
}
}
}
次に、この応答で何かを行う必要があるかどうかを再度確認し、 anyset_path("http
をに置き換えますset_path("https
。
when HTTP_RESPONSE_DATA {
if { $needToFixSvcReference equals 1 }
{
HTTP::payload replace 0 [HTTP::payload length] [string map {set_path("http set_path("https}[HTTP::payload]]
HTTP::release
}
}