2011-06-24 27 views
6

estoy usando el marco de WCF Api Web 4.0 y estoy corriendo en el maxReceivedMessageSize ha superado los 65.000 error.C# WCF Web API 4 MaxReceivedMessageSize

He actualizado mi webconfig para que se vea así pero debido a que estoy utilizando el WCF Web Api creo que esto ya no se usa porque ya no estoy usando un webHttpEndpoint?

<standardEndpoints> 
     <webHttpEndpoint> 
     <!-- 
      Configure the WCF REST service base address via the global.asax.cs file and the default endpoint 
      via the attributes on the <standardEndpoint> element below 
     --> 
     <standardEndpoint name="" 
          helpEnabled="true" 
          automaticFormatSelectionEnabled="true" 
          maxReceivedMessageSize="4194304" />  

     </webHttpEndpoint> 

Dónde puedo especificar MaxReceivedMessageSize en la nueva API Web WCF?

También he probado un CustomHttpOperationHandlerFactory en vano:

public class CustomHttpOperationHandlerFactory: HttpOperationHandlerFactory 
    {  
     protected override System.Collections.ObjectModel.Collection<HttpOperationHandler> OnCreateRequestHandlers(System.ServiceModel.Description.ServiceEndpoint endpoint, HttpOperationDescription operation) 
     { 
      var binding = (HttpBinding)endpoint.Binding; 
      binding.MaxReceivedMessageSize = Int32.MaxValue; 

      return base.OnCreateRequestHandlers(endpoint, operation); 
     } 
    } 

Respuesta

3

Si usted está tratando de hacer esto mediante programación (a través de uso MapServiceRoute con HttpHostConfiguration.Create) la forma de hacerlo es la siguiente:

IHttpHostConfigurationBuilder httpHostConfiguration = HttpHostConfiguration.Create(); //And add on whatever configuration details you would normally have 

RouteTable.Routes.MapServiceRoute<MyService, NoMessageSizeLimitHostConfig>(serviceUri, httpHostConfiguration); 

El NoMessageSizeLimitHostConfig es una extensión de HttpConfigurableServiceHostFactory que se ve algo como:

public class NoMessageSizeLimitHostConfig : HttpConfigurableServiceHostFactory 
{ 
    protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses) 
    { 
     var host = base.CreateServiceHost(serviceType, baseAddresses); 

     foreach (var endpoint in host.Description.Endpoints) 
     { 
      var binding = endpoint.Binding as HttpBinding;  

      if (binding != null) 
      { 
       binding.MaxReceivedMessageSize = Int32.MaxValue; 
       binding.MaxBufferPoolSize = Int32.MaxValue; 
       binding.MaxBufferSize = Int32.MaxValue; 
       binding.TransferMode = TransferMode.Streamed; 
      } 
     } 
     return host; 
    } 
} 
4

la maxReceivedMessageSize es una propiedad que tiene que definir en la unión estás usando. WCF en .Net 4 introdujo la configuración simplificada, por lo que si no configura nada, se usarán los valores predeterminados. El siguiente ejemplo es válido para la wsHttpBinding, usted tiene la ammend de acuerdo a su usados ​​Encuadernación y registrarlo en su web.config (asumiendo que estás utilizando un IIS servicio alojado) en la sección de unión ServiceModel.

<wsHttpBinding> 
    <binding name="CalculatorBinding" maxBufferPoolSize="2000000" maxReceivedMessageSize="2000000000" > 
     <security mode="Transport" > 
     <transport clientCredentialType="Windows" /> 
     </security> 
     <readerQuotas maxDepth="2000000" maxStringContentLength="2000000" 
     maxArrayLength="2000000" 
     maxBytesPerRead="2000000" 
     maxNameTableCharCount="2000000" /> 
    </binding> 
    </wsHttpBinding> 

HTH Dominik

+0

no ha estado capaz de conseguir que esto funcione con mis servicios –

+0

Hola nextgenneo, se las arregló para obtener su código que se ejecuta hasta ahora? – Dominik

1

Ésta es la forma en que puede hacerlo en el código

var endpoint = ((HttpEndpoint)host.Description.Endpoints[0]); //Assuming one endpoint 
endpoint.TransferMode = TransferMode.Streamed; 
endpoint.MaxReceivedMessageSize = 1024 * 1024 * 10; // Allow files up to 10MB 

Si crea una su propio host personalizado, derivado de la estándar, hay una método que puede sobrecargar para configurar HttpEndpoint.

+0

¿dónde realmente pongo este código? No sé dónde está el anfitrión. He intentado poner en mi HttpOperationHandlerFactory OnCreateRequestHandlers pero sólo tienen acceso al punto final. –

+0

@nextgenneo Ahh, usted no es autohospedado. Buen punto. No es seguro. Te avisaré si me entero. –

+0

¿Hay alguna manera de aumentar esto por API o por controlador? No quiero abrir el tamaño del mensaje para toda la API? –

3

Si aloja en IIS, puede configurar los valores que cada vez que defina la ruta (en mi caso, el Global.asax). Si tiene TransferMode conjunto de tampón (por defecto), también tendrá que establecer MaxBufferSize al mismo valor que MaxReceivedMessageSize.

protected void Application_Start() 
{ 
    var config = new HttpConfiguration(); 
    config.MaxReceivedMessageSize = int.MaxValue; 
    config.MaxBufferSize = int.MaxValue; 
    RouteTable.Routes.MapServiceRoute<MyService>("api", config); 
} 
Cuestiones relacionadas