在负载均衡器 (bigip/f5) 环境中,网站设置为在 asp.net 4.0 下运行后,WCF 服务无法正常工作。Javascript 代理请求在 asp.net 4 下作为 http 而不是 https,这导致 JS 中出现“访问被拒绝”错误。
在以前版本的 asp.net 上相同的工作没有问题。任何想法??
在负载均衡器 (bigip/f5) 环境中,网站设置为在 asp.net 4.0 下运行后,WCF 服务无法正常工作。Javascript 代理请求在 asp.net 4 下作为 http 而不是 https,这导致 JS 中出现“访问被拒绝”错误。
在以前版本的 asp.net 上相同的工作没有问题。任何想法??
这是已在 Connect 上向 Microsoft 报告的 .NET4 回归(请投票),但目前尚未得到 Microsoft 的修复。目前,我们编写了一些 F5 规则,这些规则在退出时重写内容中的协议。很烂,但可以避免在应用程序级别更改任何内容(例如编写自定义 HttpModule)。
首先,我们检查它是否是我们甚至必须处理请求,如果是,我们标记并从客户端删除 Accept-Encoding 标头,因为否则如果内容在返回的路上被 GZipped,我们将无法弄乱内容:
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
}
}
}
然后我们再次检查我们是否应该对这个响应做任何事情并将任何替换set_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
}
}