2010-10-27 17 views
9

tengo el problema con el siguiente error: "La cuota de tamaño máximo de mensaje para los mensajes entrantes (65536) se ha excedido Para aumentar la cuota, utilice la propiedad MaxReceivedMessageSize en el elemento de unión apropiada."¿Por qué mi servicio WCF no está cargando mi configuración de enlace?

Así hice un poco de investigación y descubrió que necesitaba para aumentar el búfer y el tamaño del mensaje, aquí está mi WCF archivo de configuración de servicio:

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

Cuando ejecuto el servicio en el cliente de prueba WCF y miro la configuración de cliente generado depositarlas no tiene mi encuadernación:

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

estoy perdido como por qué mi configuración de enlace es NO siendo aplicada !? WCF Test Client está configurado para regenerar siempre la configuración también. También traté de actualizar la referencia de servicio en una aplicación de usuario que consume, pero hace no obtener la configuración de enlace actualizada tampoco. Cualquier sugerencia sería muy apreciada. ¡Gracias!

+0

Me parece que su cliente está recibiendo su enlace ... –

+0

Pero no tiene mis valores maxBufferPoolSize y maxReceivedMessageSize más grandes ... – MisterIsaak

Respuesta

11

WCF does not import all all settings from your server. No hay ningún interruptor para encender eso, tampoco. Si bien podría tener sentido en muchos casos, no siempre sería una buena idea duplicar todas las configuraciones desde el lado del servidor hasta el cliente.

Por lo tanto, en su caso, lo que necesita hacer es agregar esa configuración de enlace a su proxy del lado del cliente, y hacer referencia a ella desde su punto final del cliente.

Si controla ambos extremos del cable, puede facilitar su trabajo un poco: externalizar la configuración de enlace en un archivo separado y referenciarlo.

Por lo tanto crear un archivo bindings.config que contiene:

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

y luego se puede copiar el archivo tanto en el servidor y el cliente el proyecto, y hacer referencia a ella desde el interior de su servicio y el cliente de configuración:

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

y en el lado del cliente:

<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 esa manera, y Puedes tener tu configuración para las vinculaciones una vez y usarla en ambos lugares.

+0

¡Guau, gracias por la gran explicación! Entonces, dado que el lado del cliente no consume las configuraciones de enlace del servidor, estoy obligado a configurar manualmente las configuraciones para ellos por separado. Supongo que la primera vez que hace referencia al servicio, el cliente debe ver el tipo de enlace y establecer los valores predeterminados necesarios. ¡Gracias de nuevo! – MisterIsaak

2

maxBufferPoolSize y maxReceivedMessageSize no están expuestos al cliente, solo el servidor los conoce. los tamaños que usa el cliente son predeterminados, simplemente cámbielos para que tengan el tamaño que desee. obviamente esto es problemático si lo estás regenerando mucho, pero no creo que haya mucha alternativa.

Cuestiones relacionadas