Заголовок WCF дублируется в сообщении - PullRequest
2 голосов
/ 16 февраля 2012

Недавно у меня возникла проблема с вызовами службы wcf, которые возвращали заголовок в сообщении 2 раза, один раз в начале сообщения и один раз в конце сообщения.Вот пример того, что я вижу через фиддлера:

HTTP/1.1 200 OK
Cache-Control: private
Content-Type: text/xml; charset=utf-8
Vary: Accept-Encoding
Server: Microsoft-IIS/7.5
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Thu, 16 Feb 2012 15:48:22 GMT
Content-Length: 308

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body><Person_UpdateLastCSIDResponse/></s:Body></s:Envelope>HTTP/1.1 200 OK
Cache-Control: private
Content-Length: 126
Content-Type: text/xml; charset=utf-8
Server: Microsoft-IIS/7.5
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET

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

Мы используем тип привязки basicHttpBinding через балансировщик нагрузки в приложении silverlight.

edit:

у нас естьдовольно базовая конфигурация:

сторона обслуживания:

<system.serviceModel>
 <extensions>
  <behaviorExtensions>
    <add name="silverlightFaults" type="Website.Support.SilverlightFaultBehavior, Website" />
  </behaviorExtensions>
 </extensions>
 <behaviors>
  <serviceBehaviors>
   <behavior>
    <serviceMetadata httpGetEnabled="true" />
    <serviceDebug includeExceptionDetailInFaults="true" />
   </behavior>
  </serviceBehaviors>
 </behaviors>
 <serviceHostingEnvironment aspNetCompatibilityEnabled="true"
  multipleSiteBindingsEnabled="true" />
 <services>
  <service name="Website.Services.CommonService">
   <endpoint address="" behaviorConfiguration="SilverlightFaultBehavior"
    binding="basicHttpBinding" bindingConfiguration="MyDefaultBinding"
    contract="Website.Services.CommonService" />
   <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
  </service>
 <bindings>
  <basicHttpBinding>
   <binding name="MyDefaultBinding" maxBufferSize="6500000" maxReceivedMessageSize="6500000">
     <readerQuotas maxDepth="32" maxStringContentLength="52428800" maxArrayLength="52428800"
      maxBytesPerRead="4096" maxNameTableCharCount="52428800" />
   </binding>
  </basicHttpBinding>
 </bindings>
 <client />
</system.serviceModel>

сторона клиента:

<system.serviceModel>
    <bindings>
        <basicHttpBinding>
            <binding name="SecureBinding" maxBufferSize="8388608" maxReceivedMessageSize="8388608">
                <security mode="Transport" />
            </binding>
        </basicHttpBinding>
    </bindings>

    <client>
      <endpoint address="https://Website/Services/CommonService.svc" binding="basicHttpBinding" bindingConfiguration="SecureBinding"
          contract="CommonSvcReference.CommonService" name="BasicHttpBinding_CommonService"/>
    </client>
</system.serviceModel>

1 Ответ

1 голос
/ 20 июня 2012

Мне кажется, я наконец-то решил свою проблему.Поскольку мы используем балансировщик нагрузки, вам нужно, чтобы keep-alive был ложным.Проблема в том, что BasicHttpBinding имеет keep-alive как истину.Переключение на пользовательскую привязку позволяет отключить поддержку активности, и это решило проблему.

Поскольку расширение, поддерживающее поддержку активности как ложное, вызывает замедление приложения.Чтобы решить эту проблему, я использовал пример кода на http://blog.tonysneed.com/2012/06/18/building-scalable-and-secure-wcf-services/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...