2010-10-01 4 views
2

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

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

ответ

0

Это регрессия .NET4, которая has been reported to Microsoft on Connect (пожалуйста, проголосуйте), но на данный момент у Microsoft нет никаких исправлений. На данный момент мы написали несколько правил F5, которые переписывают протокол в контенте на обратном пути. Отстой, но не позволяет изменять что-либо на уровне приложения (например, писать пользовательский HttpModule).

Прежде всего, мы проверяем, нужно ли нам обрабатывать запрос, если это так, мы отмечаем и удаляем заголовок Accept-Encoding от клиента, потому что иначе мы не сможем связать контент, если он получил GZipped on обратный путь:

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 
    } 
} 
Смежные вопросы