2010-06-05 6 views
1

Nous avons déployé un service WCF sur Windows Server 2003 qui gère les transferts de fichiers. Lorsque le fichier est au format Unix, je le convertis au format Dos lors de l'étape d'initialisation à l'aide de System.Diagnostics.Process (.WaitForExit()). Client appelle le service:Délai d'attente WCF en attente de l'achèvement de System.Diagnostics.Process

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) 

Cela fonctionne très bien, mais pour les gros fichiers de la conversion prend plus de 10 minutes et je me fais exception:

Une première chance exception de type « System.ServiceModel .CommunicationException ' s'est produite dans mscorlib.dll

Informations supplémentaires: La connexion socket a été annulée. Cela peut être dû à une erreur lors du traitement du message ou à un dépassement du délai de réception dépassé par l'hôte distant ou à un problème de ressource réseau sous-jacente . Le délai d'attente de socket local était de '00: 59: 59,8749992 '.

J'ai essayé de configurer à la fois client:

<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> 

service:

<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> 

mais sans chance. Dans la visionneuse de trace de service, je peux voir:

Le processus de fermeture a expiré en attendant la fin de l'envoi du service.

avec trace de pile:

System.ServiceModel.ServiceChannelManager.CloseInput (timeout TimeSpan ) System.ServiceModel.Dispatcher.InstanceContextManager.CloseInput (timeout TimeSpan ) de System.ServiceModel.ServiceHostBase.OnClose (TimeSpan temporisation ) System.ServiceModel.Channels.CommunicationObject.Close (TimeSpan timeout) System.ServiceModel.Channels.CommunicationObject.Close() DataSenderService.DataSender.OnStop() System.ServiceProcess.ServiceBase.DeferredStop() System.Runtime.Remoting.Messaging.StackBuilderSink._PrivateProcessMessage (IntPtr md, Object [] args, serveur d'objets, Int32 methodPtr, booléens fExecuteInContext, Object [] & outArgs) System.Runtime.Remoting.Messaging.StackBuilderSink.PrivateProcessMessage (RuntimeMethodHandle md, Object [] args, serveur d'objets, Int32 methodPtr, booléens fExecuteInContext, Object [] & outArgs) System.Runtime.Remoting.Messaging.StackBuilderSink .AsyncProcessMessage (IMessage msg, IMessageSink replySink) System.Runtime.Remoting.Proxies.AgileAsyncWorkerItem.DoAsyncCall() System.Runtime.Remoting.Proxies.AgileAsyncWorkerItem.ThreadPoolCallBack (Object o) System.Threading._ThreadPoolWaitCallback.WaitCallback_Context (Object état) System.Threading.ExecutionContext.runTryCode (Object userData) System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup (code TryCode , CleanupCode backoutCode, objet userData) System.Threading.ExecutionContext.RunInternal (ExecutionContext ExecutionContext, ContextCallback rappel, l'état d'objet) System.Threading.ExecutionContext.Run (ExecutionContext de rappel ExecutionContext, ContextCallback , état d'objet) System.Threading._ThreadPoolWaitCallback.PerformWaitCallbackInternal (_ThreadPoolWaitCallback tpWaitCallBack) System.Threading._ThreadPoolWaitCallback.PerformWaitCallback (état d'objet )

Un grand merci Bartek

Répondre

0

Votre service WCF retour réellement le contenu du fichier? Si c'est le cas, vous devriez peut-être utiliser la fonctionnalité WCF pour le streaming, et changer les fins de ligne d'Unix en DOS lorsque vous le diffusez, plutôt que de traiter le fichier et de le renvoyer comme vous le faites actuellement. Lisez chaque ligne, puis diffusez-la avec la bonne fin de ligne.

+0

Oui, le service WCF renvoie en effet le contenu du fichier. Le problème est que ces fichiers sont en fait des bases de données à plat et dans certains cas, doivent être triés avant d'être envoyés (les enregistrements sont envoyés en temps réel, un par un). Le tri de lib (de la 3ème partie) ne parvient pas à trier les fichiers au format unix - c'est pourquoi la conversion était nécessaire. Remerciements Bartek – Bartek

Questions connexes