Тайм-аут WCF ожидает завершения System.Diagnostics.Process - PullRequest
1 голос
/ 05 июня 2010

У нас есть служба WCF, развернутая на Windows Server 2003, которая обрабатывает передачу файлов. Когда файл в формате Unix, я конвертирую его в формат Dos на этапе инициализации, используя System.Diagnostics.Process (.WaitForExit ()). Клиент звонит в сервис:

    obj_DataSenderService = New DataSendClient()
    obj_DataSenderService.InnerChannel.OperationTimeout = New TimeSpan(0, System.Configuration.ConfigurationManager.AppSettings("DatasenderServiceOperationTimeout"), 0)
    str_DataSenderGUID = obj_DataSenderService.Initialize(xe_InitDetails.GetXMLNode)

Это работает нормально, однако для больших файлов преобразование занимает более 10 минут, и я получаю исключение:

Первое исключение типа 'System.ServiceModel.CommunicationException' произошло в mscorlib.dll

Дополнительная информация: розетка соединение было прервано. Это могло быть вызвано ошибкой обработки вашего сообщение или время ожидания получения превышен удаленным хостом или основная проблема сетевых ресурсов. Тайм-аут локального сокета был '00: 59: 59,8749992'

.

Я пытался настроить оба клиента:

<system.serviceModel>
  <bindings>
   <netTcpBinding>
    <binding name="NetTcpBinding_IDataSend" closeTimeout="01:00:00"
                    openTimeout="01:00:00" receiveTimeout="01:00:00" sendTimeout="01:00:00"
                    transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions"
                    hostNameComparisonMode="StrongWildcard" listenBacklog="10"
                    maxBufferPoolSize="524288" maxBufferSize="65536" maxConnections="10"
                    maxReceivedMessageSize="65536">
     <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
     <reliableSession ordered="true" inactivityTimeout="00:10:00"
                        enabled="false" />
     <security mode="None">
      <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" />
      <message clientCredentialType="Windows" />
     </security>
    </binding>
   </netTcpBinding>
  </bindings>
  <client>
   <endpoint address="net.tcp://localhost:4000/DataSenderEndPoint"
                binding="netTcpBinding" bindingConfiguration="NetTcpBinding_IDataSend"
                contract="IDataSend" name="NetTcpBinding_IDataSend">
    <identity>
     <servicePrincipalName value="host/localhost" />
     <!--<servicePrincipalName value="host/axopwrapp01.Corp.Acxiom.net" />-->
    </identity>
   </endpoint>
  </client>
 </system.serviceModel>

А сервис:

<system.serviceModel>
    <bindings>
      <netTcpBinding>
        <binding name="NetTcpBinding_IDataSend" closeTimeout="01:00:00"
                    openTimeout="01:00:00" receiveTimeout="01:00:00" sendTimeout="01:00:00"
                    transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions"
                    hostNameComparisonMode="StrongWildcard" listenBacklog="10"
                    maxBufferPoolSize="524288" maxBufferSize="65536" maxConnections="10"
                    maxReceivedMessageSize="65536">
        </binding>
      </netTcpBinding>
    </bindings>
  </system.serviceModel>

но без везения. В средстве просмотра трассировки службы я вижу:

Тайм-аут завершения процесса в ожидании завершения отправки службы.

с трассировкой стека:

System.ServiceModel.ServiceChannelManager.CloseInput (TimeSpan тайм-аут) System.ServiceModel.Dispatcher.InstanceContextManager.CloseInput (TimeSpan тайм-аут) System.ServiceModel.ServiceHostBase.OnClose (TimeSpan тайм-аут) System.ServiceModel.Channels.CommunicationObject.Close (TimeSpan тайм-аут) System.ServiceModel.Channels.CommunicationObject.Close () DataSenderService.DataSender.OnStop () System.ServiceProcess.ServiceBase.DeferredStop () System.Runtime.Remoting.Messaging.StackBuilderSink._PrivateProcessMessage (IntPtr md, Object [] args, Object server, Int32 methodPtr, Boolean fExecuteInContext, Object [] & outArgs) System.Runtime.Remoting.Messaging.StackBuilderSink.PrivateProcessMessage (RuntimeMethodHandle md, Object [] args, Object server, Int32 methodPtr, Boolean fExecuteInContext, Object [] & outArgs) System.Runtime.Remoting.Messaging.StackBuilderSink.AsyncProcessMessage (Шеззаде msg, IMessageSink replySink) System.Runtime.Remoting.Proxies.AgileAsyncWorkerItem.DoAsyncCall () System.Runtime.Remoting.Proxies.AgileAsyncWorkerItem.ThreadPoolCallBack (Объект о) System.Threading._ThreadPoolWaitCallback.WaitCallback_Context (Объект государство) System.Threading.ExecutionContext.runTryCode (Объект данные пользователя) System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup (TryCode код, CleanupCode backoutCode, Object данные пользователя) System.Threading.ExecutionContext.RunInternal (ExecutionContext executeContext, ContextCallback обратный вызов, состояние объекта) System.Threading.ExecutionContext.Run (ExecutionContext executeContext, ContextCallback обратный вызов, состояние объекта) System.Threading._ThreadPoolWaitCallback.PerformWaitCallbackInternal (_ThreadPoolWaitCallback tpWaitCallBack) System.Threading._ThreadPoolWaitCallback.PerformWaitCallback (Объект состояние)

Большое спасибо Bartek

1 Ответ

0 голосов
/ 05 июня 2010

Служба WCF действительно возвращает содержимое файла?Если это так, возможно, вам следует использовать возможности WCF для потоковой передачи и изменять окончания строк с Unix на стиль DOS во время потоковой передачи, а не обрабатывать файл и затем возвращать его, как вы это делаете в настоящее время.Прочитайте в каждой строке, а затем передайте ее с правильным окончанием строки.

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