WCF timedout正在等待System.Diagnostics.Process完成

WCF timedout正在等待System.Diagnostics.Process完成,wcf,Wcf,我们在WindowsServer2003上部署了一个WCF服务,用于处理文件传输。当文件为Unix格式时,我将在初始化阶段使用System.Diagnostics.Process(.WaitForExit())将其转换为Dos格式。客户端调用服务: obj_DataSenderService = New DataSendClient() obj_DataSenderService.InnerChannel.OperationTimeout = New TimeSpan(0, Sy

我们在WindowsServer2003上部署了一个WCF服务,用于处理文件传输。当文件为Unix格式时,我将在初始化阶段使用System.Diagnostics.Process(.WaitForExit())将其转换为Dos格式。客户端调用服务:

    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(时间跨度 超时) System.ServiceModel.Dispatcher.InstanceContextManager.CloseInput(TimeSpan 超时) System.ServiceModel.ServiceHostBase.OnClose(TimeSpan 超时) System.ServiceModel.Channel.CommunicationObject.Close(时间跨度 超时) System.ServiceModel.Channels.CommunicationObject.Close() DataSenderService.DataSender.OnStop() System.ServiceProcess.ServiceBase.DeferredStop() System.Runtime.Remoting.Messaging.StackBuilderSink.\u PrivateProcessMessage(IntPtr md,对象[]参数,对象服务器, Int32 methodPtr,布尔型 fExecuteInContext,对象[]& 外来者) System.Runtime.Remoting.Messaging.StackBuilderSink.PrivateProcessMessage(RuntimeMethodHandle md,对象[]参数,对象服务器, Int32 methodPtr,布尔型 fExecuteInContext,对象[]& 外来者) System.Runtime.Remoting.Messaging.StackBuilderSink.AsyncProcessMessage(IMessage msg,IMessageSink replySink) System.Runtime.Remoting.Proxies.AgileAsyncWorkerItem.DoAsyncCall() System.Runtime.Remoting.Proxies.AgileAsyncWorkerItem.ThreadPoolCallBack(对象 o) System.Threading._ThreadPoolWaitCallback.WaitCallback_上下文(对象 (州) System.Threading.ExecutionContext.runTryCode(对象 用户数据) System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode 代码,清除代码backoutCode,对象 用户数据) System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext,ContextCallback 回调(对象状态) System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback 回调(对象状态) System.Threading.\u ThreadPoolWaitCallback.PerformWaitCallbackInternal(\u ThreadPoolWaitCallback tpWaitCallBack) System.Threading.\u ThreadPoolWaitCallback.PerformWaitCallback(对象 (州)

非常感谢
Bartek

您的WCF服务是否实际返回文件内容?如果是这样,也许您应该使用WCF的流式处理功能,并在流式处理文件时将行结尾从Unix更改为DOS样式,而不是像当前那样处理文件然后返回。读入每一行,然后以正确的行尾将其输出。

是的,WCF服务确实返回文件内容。问题在于,这些文件实际上是平面文件数据库,在某些情况下,必须在发送之前进行排序(记录一个接一个地实时发送)。但是,排序库(来自第三方)无法对unix格式的文件进行排序,这就是为什么需要进行转换。谢谢你,巴特克