Служба WCF под проблемой loadbalancer - PullRequest
2 голосов
/ 01 октября 2010

В среде loadbalancer (bigip / f5) службы WCF не работают после того, как веб-сайт настроен для работы под asp.net 4.0. Запросы прокси-сервера Javascript выполняются как http вместо https в asp.net 4, что вызывает ошибки «Доступ запрещен» в JS.

то же самое работает без проблем на предыдущей версии asp.net. Есть идеи ??

1 Ответ

0 голосов
/ 03 ноября 2010

Это регрессия .NET4, о которой было сообщено Microsoft в Connect (пожалуйста, оцените ее), но от 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
    }
}
...