2009-07-30 6 views
1

J'ai un service WCF hébergé dans IIS7 (le service et la configuration du client se trouvent à la fin de ce post). J'ai traversé un scénario étrange que j'espérais que quelqu'un pourrait avoir des idées sur la façon de l'attaquer et de trouver une solution.Le message de réponse WCF prend 40 minutes et aucune exception de délai d'attente n'est levée

Le service expose uniquement un contrat, 'ProcessMessage'. Je peux envoyer/recevoir des messages synchrones à partir du service en utilisant ce contrat juste avec les performances attendues, mais un appel particulier à ce contrat renvoie plus de 65 Ko de données; environ 1 Mo Lors de l'appel initial, j'ai reçu la taille de réception maximale attendue erreur dépassée. J'ai donc augmenté le maxReceivedMessageSize, et maintenant cet appel particulier prend 40 minutes pour retourner au client. C'est bien au-delà de tous les paramètres de délai d'attente, et bien au-delà de ce que je m'attendrais à ce qu'il prenne. Le temps de traitement côté serveur est de seulement 2 secondes. Il semble être tenu du côté du client.

J'ai également essayé de faire tomber plusieurs des autres quotas dans le fichier en vain.

Toutes les pensées seraient grandement appréciées. Merci.

Config Service:

<system.serviceModel> 
<services> 
    <service behaviorConfiguration="Lrs.Esf.Facade.Startup.FacadeBehavior" 
    name="Lrs.Esf.Facade.Startup.FacadeService"> 
    <endpoint address="" binding="wsHttpBinding" bindingConfiguration="default" contract="Lrs.Esf.Facade.Startup.IFacadeService"> 
     <identity> 
     <servicePrincipalName value="lrsdomain/PensionDev" /> 
     </identity> 
    </endpoint> 
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
    </service> 
</services> 
<bindings> 
    <wsHttpBinding> 
    <binding name="default"> 
     <security mode="None"/> 
    </binding> 
    </wsHttpBinding> 
</bindings> 
<behaviors> 
    <serviceBehaviors> 
    <behavior name="Lrs.Esf.Facade.Startup.FacadeBehavior"> 
     <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment --> 
     <serviceMetadata httpGetEnabled="true" /> 
     <!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information --> 
     <serviceDebug includeExceptionDetailInFaults="true" /> 

    </behavior> 
    </serviceBehaviors> 
</behaviors> 

client Config:

<system.serviceModel> 
<bindings> 
    <wsHttpBinding> 
    <binding name="WSHttpBinding_IFacadeService" closeTimeout="00:01:00" 
     openTimeout="00:01:00" receiveTimeout="00:1:00" sendTimeout="00:01:00" 
     bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" 
     maxBufferPoolSize="52428800" maxReceivedMessageSize="6553600" 
     messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" 
     allowCookies="false"> 
     <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" 
      maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" /> 
     <security mode="None">   
     </security> 
    </binding> 
    </wsHttpBinding> 
</bindings> 
<client> 
    <endpoint address="http://esf2.facade.testpe.pg.local/FacadeWcf/FacadeService.svc" 
     binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IFacadeService" 
     contract="FacadeServiceReference.IFacadeService" name="WSHttpBinding_IFacadeService"> 
    <identity> 
     <servicePrincipalName value="lrsdomain/PensionDev" /> 
    </identity> 
    </endpoint> 
</client> 

+0

J'ai exécuté Fiddler et une trace complète du processus client et j'ai plus d'informations. Le message de réponse revient à l'ordinateur client en quelques secondes (fiddler), mais la trace du journal des messages et le message «Reçu un message sur un canal» ne sont consignés que 40 minutes plus tard. Je suppose qu'il faut 40 minutes pour désérialiser le message. – Mark

+0

J'ai retiré l'hôte de service de IIS et créé un point de terminaison TCP et l'appel d'un PC client revient maintenant dans 5 secondes. Mon hypothèse est maintenant qu'il y a un bogue dans wsHTTP ou un paramètre dans wsHTTP ou IIS qui me manque. – Mark

+0

J'ai activé WAS/TCP et ajouté un point de terminaison TCP au service hébergé IIS. L'appel via TCP ne prend que quelques secondes, mais l'appel via HTTP (basique ou ws) prend encore 40 minutes. – Mark

Répondre

0

J'ai compris la cause de base de la question et une solution de contournement, mais un aperçu supplémentaire serait génial.

Le DataSet était sérialisé au format XML par WCF. J'ai forcé le DataSet à sérialiser comme un octet [] et le temps réduit à 4 secondes. Une hypothèse est que l'échappement de tous les caractères dans 4 Mo de XML afin que la communication HTTP était valide est ce qui a causé le problème.

+1

Encore une autre raison de ne pas utiliser les types spécifiques à .NET dans le contrat d'un service. –

+0

J'ai lu ça John. Alors que suggérez-vous quand vous avez besoin de transporter un ensemble de données à travers le fil. Sérialiser à JSON et désérialiser à l'autre extrémité? – Mark

+0

J'ai fait un peu plus d'investigations et l'ensemble de données renvoyé contenait une ligne et une colonne, mais la valeur de cette colonne était elle-même XML et assez grande à cela. J'ai contourné ceci en sérialisant différemment la valeur de la colonne avant que la WCF ne soit impliquée, et ainsi évité ce problème. – Mark

1

Vous n'a pas augmenté la taille des différents paramete rs sur le côté serveur, il semble - vous devriez certainement essayer ça! Utilisez également la configuration de liaison de votre fichier de configuration client côté serveur: le service risque de s'étouffer car la taille des messages par défaut est toujours de 64 Ko.

En outre, le receiveTimeout dans votre client de liaison est un peu drôle - il manque un chiffre zéro:

<binding name="WSHttpBinding_IFacadeService" 
receiveTimeout="00:1:00" 

Vous devez utiliser receiveTimeout="00:01:00"

Marc

+0

Merci Marc.Je ne pensais pas que ces paramètres s'appliquaient au côté serveur, mais j'ai essayé cela après votre suggestion et cela n'a pas changé le résultat. J'ai également fixé le délai d'expiration. Depuis que j'ai reçu l'erreur d'origine concernant la taille du message côté client, mon hypothèse est que l'erreur s'est produite et non sur le serveur. Le fait que les temporisations ne se déclenchent pas est assez perplexe. C'est presque comme si WCF avait fini de traiter le message côté client et pensait qu'il restituait le contrôle au client, mais qu'il bloque toujours pour une raison quelconque. – Mark

+0

OK, intéressant - et vous n'obtenez vraiment aucun délai d'attente ou d'autres erreurs sur le client? C'est plutôt étrange ...... –

+0

Voyez-vous des entrées dans le journal des événements du serveur? Peut-être que IIS a mis quelque chose dans le journal? Semble étrange qu'il n'y aurait rien du tout .... –

Questions connexes