У нас есть служба 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