负载均衡器问题下的WCF服务

时间:2010-10-01 13:57:10

标签: wcf load-balancing f5

在loadbalancer(bigip / f5)环境中,在将网站设置为在asp.net 4.0下运行后,WCF服务无法正常工作。在asp.net 4下,Javascript代理请求以http而不是https的形式出现,这导致JS中出现“拒绝访问”错误。

同样的工作,在以前版本的asp.net上没有任何问题。有什么想法??

1 个答案:

答案 0 :(得分:0)

这是一个{4}的.NET4回归(请将其投票赞成),但尚未得到Microsoft的修复。现在我们写了一些F5规则,在返回的路上重写内容中的协议。很糟糕,但可以防止在应用程序级别更改任何内容(比如编写自定义的HttpModule)。

首先我们检查是否我们必须处理请求,如果是这样我们标记并从客户端删除Accept-Encoding标头,否则我们将无法弄乱内容如果它被GZip压缩回来的路:

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
    }
}