WCF Сервис с большими параметрами - PullRequest
0 голосов
/ 27 января 2011

Я посмотрел несколько похожих тем на SO, но не нашел ни одной, которая бы помогала с этим.

Иметь службу WCF, которая обрабатывает XML. Файл XML, с которого я читаю, ~ 600K.

Вызов работает для небольших XML-файлов (большую часть времени), но на больших файлах я получаю сообщение об ошибке:

System.ServiceModel.Security.MessageSecurityException:
Необеспеченная или неправильно защищенная ошибка была получена от другой стороны. См. Внутреннее исключение FaultException для получения кода ошибки и подробностей.

где внутреннее исключение:

System.ServiceModel.FaultException:
Сообщение не может быть обработано. Скорее всего, это связано с тем, что действие 'http://tempuri.org/ISapListener/ProcessSapRoles' неверно, или потому что сообщение содержит недопустимый токен или токен контекста безопасности с истекшим сроком действия или из-за несоответствия между привязками. Маркер контекста безопасности будет недействительным, если служба прервет канал из-за неактивности. Чтобы предотвратить прерывание незанятыми сеансами службы преждевременно, увеличьте время ожидания приема для привязки конечной точки службы.

Как я уже сказал ... он работает для небольших файлов, и мои тайм-ауты открытия, отправки, получения, закрытия и неактивности установлены на 10 минут. Это терпит неудачу приблизительно через 20-30 секунд.

Кроме того, часы на сервере и клиенте идеально синхронизированы (я видел это как ответ).

Мои конфигурационные файлы в том виде, в каком они сейчас есть (я играл с большим количеством настроек):

Сервер:

<bindings>
  <wsHttpBinding>
    <binding name="wsHttpBinding_Custom" closeTimeout="00:00:10"
             openTimeout="00:01:00" receiveTimeout="00:10:00"
             sendTimeout="00:10:00" bypassProxyOnLocal="false" 
             transactionFlow="false" hostNameComparisonMode="StrongWildcard"
             messageEncoding="Text" textEncoding="utf-8" 
             useDefaultWebProxy="true" allowCookies="false"
             maxReceivedMessageSize="1024768"            
             maxBufferPoolSize="1024768" >
      <readerQuotas maxDepth="32" 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" />
      </security>
    </binding>
  </wsHttpBinding>
</bindings>
<services>
  <service behaviorConfiguration="CSA.GS3.Services.SapListenerBehavior" 
           name="CSA.GS3.Services.SapListener">
    <endpoint address="" binding="wsHttpBinding"  
              bindingConfiguration="wsHttpBinding_Custom" 
              contract="CSA.GS3.Services.ISapListener">
      <identity>
        <dns value="localhost" />
      </identity>
    </endpoint>
    <endpoint address="mex" binding="mexHttpBinding" 
              contract="IMetadataExchange" />
  </service>
</services>
<behaviors>
  <serviceBehaviors>
    <behavior name="CSA.GS3.Services.SapListenerBehavior">
      <serviceMetadata httpGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="true" />
    </behavior>
  </serviceBehaviors>
</behaviors>

Клиент:

<bindings>
  <wsHttpBinding>
    <binding name="WSHttpBinding_ISapListener1" 
             closeTimeout="00:10:00" openTimeout="00:10:00" 
             receiveTimeout="00:10:00" sendTimeout="00:10:00"
             bypassProxyOnLocal="false" transactionFlow="false"
             hostNameComparisonMode="StrongWildcard"
             messageEncoding="Text" textEncoding="utf-8" 
             useDefaultWebProxy="true" allowCookies="false"
             maxBufferPoolSize="1024768" 
             maxReceivedMessageSize="1024768">
      <readerQuotas maxDepth="32" 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" />
      </security>
    </binding>
  </wsHttpBinding>
</bindings>
<client>
  <endpoint address="http://gs3-test.us.tycoelectronics.com/SapListener/SapListener.svc"
            binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_ISapListener1"
            contract="Gs3TestSapListener.ISapListener" 
            name="WSHttpBinding_ISapListener1">
    <identity>
      <dns value="localhost" />
    </identity>
  </endpoint>
</client>

У меня включена трассировка в службе, но я не вижу смысла в файлах журналов.

Другие исключения, которые я получил во время игры с настройками конфигурации:

System.ServiceModel.Security.SecurityNegotiationException
Защищенный канал не может быть открыт из-за сбоя согласования безопасности с удаленной конечной точкой.

и

System.ServiceModel.ServiceActivationException
Запрошенная служба 'http: //../SapListener.svc' не может быть активирована.

Ответы [ 4 ]

0 голосов
/ 08 апреля 2011

Если это возможно и приемлемо для клиента, вы можете разбить файл на более мелкие куски и переслать их, при условии, что у вас нет цифрового сертификата и т. Д. И вариантов сортировки на стороне клиента.

0 голосов
/ 27 января 2011
System.ServiceModel.ServiceActivationException
The requested service, 'http://../SapListener.svc' could not be activated.

Это может быть ошибка компиляции или неверная конфигурация.

Это WCF 4.0?Затем вы можете удалить свою пользовательскую конфигурацию и использовать автоматические привязки.Я также предлагаю вам попробовать связывание, отличное от wsHttpBinding, например basicHttpBinding.

0 голосов
/ 01 февраля 2011

Я смог заставить это работать со следующей конфигурацией:

Сервер:

<bindings>
  <wsHttpBinding>
    <binding name="wsHttpBinding_Custom"
             closeTimeout="00:10:00"
             openTimeout="00:10:00"
             receiveTimeout="00:10:00"
             sendTimeout="00:10:00"
             maxReceivedMessageSize="2097152"
             bypassProxyOnLocal="false" transactionFlow="false" 
             hostNameComparisonMode="StrongWildcard"
             maxBufferPoolSize="2097152" messageEncoding="Text"
             textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false">
      <readerQuotas maxDepth="32" 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" />
      </security>
    </binding>
  </wsHttpBinding>
</bindings>

Клиент:

<bindings>
  <wsHttpBinding>
    <binding name="WSHttpBinding_ISapListener1" closeTimeout="00:10:00"
             openTimeout="00:10:00" receiveTimeout="00:10:00" sendTimeout="00:10:00"
             bypassProxyOnLocal="false" transactionFlow="false" 
             hostNameComparisonMode="StrongWildcard"
             maxBufferPoolSize="2097152" 
             maxReceivedMessageSize="2097152"
             messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
             allowCookies="false">
      <readerQuotas maxDepth="32" 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" />
      </security>
    </binding>
  </wsHttpBinding>
</bindings>

Единственное отличие, которое я вижуэто то, что я столкнулся с maxReceivedMessageSize и maxBufferPoolSize ... может быть, я что-то упускаю?Если это была проблема, то проблема заключалась в том, что мои накладные расходы на вызов добавляли дополнительные 400 + K к данным 600K xml, которые я отправлял

0 голосов
/ 27 января 2011

Если вы считаете, что здесь вам поможет возможность разобраться с файлами журналов, используйте svcTraceViewer.Просто убедитесь, что вы правильно настроили трассировку.У меня есть статья в моем блоге об этом. svcTraveViewer Отладка служб WCF

Что касается больших полезных нагрузок, вы можете взглянуть на эту статью MSDN.http://msdn.microsoft.com/en-us/library/ms733742.aspx

В частности, потоковые данные.

...