2010-09-03 6 views
3

Я раньше не занимался балансировкой нагрузки. Мой клиент имеет службу WCF, созданную и протестированную на серверах, используя конфигурацию модели обслуживания, которая является относительно простой. Он предоставляет услугу для возврата изображения карты для другого приложения. Чтобы получить карту, она вызывает другие службы.Как настроить службу WCF, которая вызывает другие службы за балансировщиком нагрузки?

Служба была создана в Visual Studio 2010, ориентированной на структуру 3.5. Клиент использует IIS 7.5 и балансировщик нагрузки F5. При переходе на сервер производства, Web.config был изменен, чтобы добавить поведение балансировки нагрузки и указать конечную точку, чтобы показать физический и логический адрес службы:

 <services> 
     <service behaviorConfiguration="Service.Service1Behavior" name="StaticMapImageService.Data.MapImageService"> 
     <endpoint 
       address="https://gis.customer.com/StaticMapImage/Service/StaticMapImageService.svc" 
       binding="basicHttpBinding" 
       bindingNamespace="http://customer.com" 
       contract="StaticMapImageService.Data.IMapImageService" 
       listenUri="http://hq-gis01.customer.net/StaticMapImage/Service/StaticMapImageService.svc" 
       behaviorConfiguration="SSLLoadBalancerBehavior"> 
     </endpoint> 
     <endpoint 
       address="mex" 
       binding="mexHttpBinding" 
       bindingNamespace="http://werner.com" 
       contract="IMetadataExchange"/> 
     </service> 
    </services> 

Там нет записи для этой службы в system.servicemodel/bindings. Остальные службы настроены в переплетах и ​​секции клиента:

 <bindings> 
     <basicHttpBinding> 
     <binding name="BasicHttpBinding_IAddressVerificationService" 
      closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" 
      sendTimeout="00:01:00" allowCookies="false" bypassProxyOnLocal="false" 
      hostNameComparisonMode="StrongWildcard" maxBufferSize="999999999" 
      maxBufferPoolSize="524288" maxReceivedMessageSize="999999999" 
      messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" 
      useDefaultWebProxy="true"> 
      <readerQuotas maxDepth="32" maxStringContentLength="999999999" maxArrayLength="16384" 
       maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
      <security mode="None"> 
      <transport clientCredentialType="None" proxyCredentialType="None" 
       realm="" /> 
      <message clientCredentialType="UserName" algorithmSuite="Default" /> 
      </security> 
     </binding> 
     <binding name="BasicHttpBinding_IGeocoderService" closeTimeout="00:01:00" 
      openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
      allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" 
      maxBufferSize="999999999" maxBufferPoolSize="524288" maxReceivedMessageSize="999999999" 
      messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" 
      useDefaultWebProxy="true"> 
      <readerQuotas maxDepth="32" maxStringContentLength="999999999" maxArrayLength="16384" 
       maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
      <security mode="None"> 
      <transport clientCredentialType="None" proxyCredentialType="None" 
       realm="" /> 
      <message clientCredentialType="UserName" algorithmSuite="Default" /> 
      </security> 
     </binding> 
     <binding name="PCMilerSoap" closeTimeout="00:01:00" openTimeout="00:01:00" 
      receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false" 
      bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" 
      maxBufferSize="999999999" maxBufferPoolSize="524288" maxReceivedMessageSize="999999999" 
      messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" 
      useDefaultWebProxy="true"> 
      <readerQuotas maxDepth="32" maxStringContentLength="999999999" maxArrayLength="16384" 
       maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
      <security mode="None"> 
      <transport clientCredentialType="None" proxyCredentialType="None" 
       realm="" /> 
      <message clientCredentialType="UserName" algorithmSuite="Default" /> 
      </security> 
     </binding> 
     </basicHttpBinding> 
     <wsHttpBinding> 
     <binding name="WSHttpBinding_IGeocoderService" closeTimeout="00:01:00" 
      openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
      bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" 
      maxBufferPoolSize="524288" maxReceivedMessageSize="999999999" 
      messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" 
      allowCookies="false"> 
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
       maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
      <reliableSession ordered="true" inactivityTimeout="00:10:00" 
       enabled="false" /> 
      <security mode="Message"> 
      <transport clientCredentialType="Windows" proxyCredentialType="None" 
       realm="" /> 
      <message clientCredentialType="Windows" negotiateServiceCredential="true" 
       algorithmSuite="Default" establishSecurityContext="true" /> 
      </security> 
     </binding> 
     </wsHttpBinding> 
    </bindings> 
    <client> 
     <endpoint address="https://gis.customer.com/AddressVerification/Service/AddressVerificationService.svc" 
      binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IAddressVerificationService" 
      contract="AddressVerificationService.IAddressVerificationService" 
      name="BasicHttpBinding_IAddressVerificationService" /> 
     <endpoint address="https://gis.customer.com/Geocoder/Service/GeocoderService.svc/ws" 
      binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IGeocoderService" 
      contract="GeocoderService.IGeocoderService" name="WSHttpBinding_IGeocoderService"> 
     <identity> 
      <dns value="localhost" /> 
     </identity> 
     </endpoint> 
     <endpoint address="https://gis.customer.com/Geocoder/Service/GeocoderService.svc/soap" 
      binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IGeocoderService" 
      contract="GeocoderService.IGeocoderService" name="BasicHttpBinding_IGeocoderService" /> 
     <endpoint address="http://hq-miler02.customer.net/MultiMiler/ALKWS/PCMiler.asmx" 
      binding="basicHttpBinding" bindingConfiguration="PCMilerSoap" 
      contract="PCMiler.PCMilerSoap" name="PCMilerSoap" /> 
    </client> 

Существовала проблема, когда служба была развернута на сервер позади балансировки нагрузки. Когда я пытаюсь вызвать службу из WCFStorm или WebServiceStudio, я получаю сообщение «Предоставленная схема URI« https »недействительна, ожидаемая« http ».

Конечные точки для самой услуги выглядят мне прямо. и тестируя версии конфигурации, клиентская секция использует http вместо http, тогда как на производственных серверах он использует адрес https для балансировки нагрузки.

Это похоже на то, что это должно быть очевидно, но мы этого не имеем. дайте нам ключ?

+0

Кто-нибудь? Неужели этот вопрос глуп? Был ли мой вопрос слишком длинным или неясным? TMI? –

+1

Вопрос не является хорошим. Но опыт с этим сценарием встречается редко. Попробуйте также спросить на форуме MSDN WCF: http://social.msdn.microsoft.com/Forums/en-US/wcf/threads –

+0

Спасибо, Ладислав. Я сделал это, хотя в этом случае это не помогло. Оказалось, что наша сетевая безопасность была изменена и ничего не пропускала даже при правильной настройке. Если вы хотите, чтобы ваш комментарий был ответом, я отмечу его принятым. –

ответ

0

У нас есть службы wcf, настроенные за балансировкой сетевой нагрузки Windows без каких-либо проблем (ну был один, но это не было связано с NLB).

Я думаю, что это связано с адресом. Веб-сервер обычно не знает, что он находится за балансировщиком нагрузки. все, что он видит, это запросы, поступающие из одного источника, балансировки нагрузки. В вашей привязке он прослушивает https, но если балансировщик нагрузки не разговаривает с веб-сервером по https, что редко, запросы наступают через http, следовательно, ошибка.

Вам нужно либо изменить адрес на http, либо установить балансировщик нагрузки, чтобы поговорить с веб-сервером через http.

0

Так что я опаздываю на вечеринку, но я столкнулся с той же проблемой, позвонив в службу F5. Измените безопасность привязки вашего клиента на «Транспорт» вместо «Нет».