2010-10-27 20 views
9

J'ai le problème avec l'erreur suivante: «Le quota de taille maximale des messages pour les messages entrants (65536) a été dépassé d'augmenter le quota, utilisez la propriété MaxReceivedMessageSize sur l'élément de liaison approprié. »Pourquoi mon service WCF ne charge-t-il pas ma config Binding?

donc Je l'ai fait quelques recherches et trouvé que je devais augmenter la mémoire tampon et la taille du message, voici mon WCF fichier de configuration de service:

<system.serviceModel> 
    <bindings> 
     <wsHttpBinding> 
      <binding name="default" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647"/> 
     </wsHttpBinding> 
    </bindings> 
    <services> 
     <service name="WCF.Service.Service"> 
     <endpoint address="ws" name="ws" bindingConfiguration="default" binding="wsHttpBinding" contract="WCF.Service.Contracts.IService" /> 
     <endpoint address="mex" binding="mexHttpBinding" name="mex" contract="IMetadataExchange" /> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior> 
      <!-- 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> 
    </system.serviceModel> 

Quand je lance le service dans le client de test WCF et regarde le fichier config client généré il n'a pas ont ma liaison:

<configuration> 
<system.serviceModel> 
    <bindings> 
     <wsHttpBinding> 
      <binding name="ws" closeTimeout="00:01:00" openTimeout="00:01:00" 
       receiveTimeout="00:10:00" sendTimeout="00:01:00" bypassProxyOnLocal="false" 
       transactionFlow="false" hostNameComparisonMode="StrongWildcard" 
       maxBufferPoolSize="524288" maxReceivedMessageSize="65536" 
       messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" 
       allowCookies="false"> 
       <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
        maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
       <reliableSession ordered="true" inactivityTimeout="00:10:00" 
        enabled="false" /> 
       <security mode="Message"> 
        <transport clientCredentialType="Windows" proxyCredentialType="None" 
         realm="" /> 
        <message clientCredentialType="Windows" negotiateServiceCredential="true" 
         algorithmSuite="Default" /> 
       </security> 
      </binding> 
     </wsHttpBinding> 
    </bindings> 
    <client> 
     <endpoint address="http://localhost:37444/Service.svc/ws" binding="wsHttpBinding" 
      bindingConfiguration="ws" contract="IService" name="ws"> 
      <identity> 
       <userPrincipalName value="[email protected]" /> 
      </identity> 
     </endpoint> 
    </client> 
</system.serviceModel> 

Je suis perdu comme pourquoi ma configuration de liaison est PAS s'appliqué !? Le client de test WCF est configuré pour toujours régénérer la configuration. J'ai également essayé de mettre à jour la référence de service dans une application frontale consommatrice, mais cela n'obtient pas non plus pas la configuration de liaison mise à jour. Toutes les suggestions seraient grandement appréciées. Merci!

+0

Il me semble que votre client obtient votre liaison ... –

+0

Mais il n'a pas mes plus grandes valeurs maxBufferPoolSize et maxReceivedMessageSize ... – MisterIsaak

Répondre

11

WCF ne pas importer tous les paramètres de votre serveur. Il n'y a pas d'interrupteur pour l'activer non plus. Bien que cela puisse avoir du sens dans de nombreux cas, il ne serait pas toujours judicieux de dupliquer tous les paramètres du serveur vers le client. Par conséquent, dans votre cas, vous devez également ajouter cette configuration de liaison à votre proxy côté client et la référencer depuis votre point de terminaison client.

Si vous contrôlez les deux extrémités du fil, vous pouvez alléger un peu votre travail: externaliser la configuration de liaison dans un fichier séparé et la référencer.

donc créer un fichier bindings.config qui contient:

<?xml version="1.0" ?> 
<bindings> 
    <wsHttpBinding> 
     <binding name="default" 
       maxBufferPoolSize="2147483647" 
       maxReceivedMessageSize="2147483647"/> 
    </wsHttpBinding> 
</bindings> 

et vous pouvez copier ce fichier à la fois dans le serveur et le projet client, et référencer à partir de votre configuration de service et le client:

<system.serviceModel> 
    <bindings configSource="bindings.config" /> 
    <services> 
     <service name="WCF.Service.Service"> 
     <endpoint address="ws" name="ws" bindingConfiguration="default" binding="wsHttpBinding" contract="WCF.Service.Contracts.IService" /> 
     <endpoint address="mex" binding="mexHttpBinding" name="mex" contract="IMetadataExchange" /> 
     </service> 
    </services> 

et de votre côté client:

<system.serviceModel> 
    <bindings configSource="bindings.config" /> 
    <client> 
     <endpoint name="ws" 
      address="http://localhost:37444/Service.svc/ws" 
      binding="wsHttpBinding" 
      bindingConfiguration="default" 
      contract="IService"> 
      <identity> 
       <userPrincipalName value="[email protected]" /> 
      </identity> 
     </endpoint> 
    </client> 
</system.serviceModel> 

de cette façon, y Vous pouvez avoir votre configuration pour les liaisons une fois, et utilisé dans les deux endroits.

+0

Wow, merci pour la bonne explication! Comme le client ne consomme pas les configurations de liaison du serveur, il est nécessaire de configurer manuellement les paramètres séparément. Je suppose que lorsque vous référencez le service pour la première fois, le client doit voir le type de liaison et définir les valeurs par défaut requises. Merci encore! – MisterIsaak

2

Les valeurs maxBufferPoolSize et maxReceivedMessageSize ne sont pas exposées au client, seul le serveur en est conscient. les tailles que le client utilise sont par défaut, il suffit de les changer pour être de la taille que vous voulez. c'est évidemment problématique si vous le régénérez beaucoup, mais je ne pense pas qu'il y ait beaucoup d'alternative.