2010-10-27 13 views
9

ho il problema con il seguente errore: "La quota dimensione massima dei messaggi per i messaggi in arrivo (65536) è stato superato di aumentare la quota, utilizzare la proprietà MaxReceivedMessageSize sull'elemento di rilegatura appropriato."Perché il servizio WCF non sta caricando la mia configurazione di binding?

Così ho fatto qualche ricerca e ha scoperto che avevo bisogno di aumentare il buffer e dimensione del messaggio, ecco la mia WCF service file di configurazione:

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

Quando eseguo il servizio nel client di prova WCF e guardo il config client generato archiviarlo non ha ho il mio impegno:

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

Mi sono perso come il motivo per cui la mia configurazione è vincolante NON sempre applicato !? Il client di test WCF è impostato per rigenerare sempre anche la configurazione. Ho anche provato ad aggiornare il riferimento del servizio in un'applicazione front-end che consuma, ma lo è non ottenere la configurazione di binding aggiornata. Ogni suggerimento sarà molto apprezzato. Grazie!

+0

Mi sembra che il tuo cliente riceva l'associazione ... –

+0

Ma non ha i miei valori maxBufferPoolSize e maxReceivedMessageSize più grandi ... – MisterIsaak

risposta

11

WCF fa non importa tutte le impostazioni dal server. Non c'è nessun interruttore per accenderlo, neanche. Anche se in molti casi potrebbe avere senso, non sarebbe sempre una buona idea duplicare semplicemente tutte le impostazioni dal lato server al client.

Quindi, nel tuo caso, ciò che devi fare è aggiungere anche quella configurazione vincolante al tuo proxy lato client e farne riferimento dal tuo endpoint client.

Se si controllano entrambe le estremità del cavo, è possibile semplificare un po 'il lavoro: esternare la configurazione di rilegatura in un file separato e farne riferimento.

Quindi creare un file bindings.config che contiene:

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

e quindi è possibile copiare il file sia nel server e il progetto client, e fare riferimento dall'interno il vostro servizio e il client di configurazione:

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

e sul lato 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> 

in questo modo, y Puoi avere la tua configurazione per i binding fatta una volta e usata in entrambi i posti.

+0

Wow, grazie per l'ottima spiegazione! Quindi dal momento che il lato client non consuma le configurazioni di binding dal server, sono obbligato a configurare manualmente le impostazioni separatamente. Sto assumendo quando si fa riferimento per la prima volta al servizio che il client deve vedere il tipo di associazione e impostare i valori predefiniti richiesti. Grazie ancora! – MisterIsaak

2

MaxBufferPoolSize e maxReceivedMessageSize non sono esposti al client, solo il server ne è a conoscenza. le dimensioni che il client sta usando sono le impostazioni predefinite, basta cambiarle per essere la dimensione desiderata. ovviamente questo è problematico se lo stai rigenerando molto, ma non credo ci sia molta alternativa.

Problemi correlati