C # WCF Web Api 4 MaxReceivedMessageSize - PullRequest
6 голосов
/ 24 июня 2011

Я использую платформу WCF Web Api 4.0 и работаю с ошибкой maxReceivedMessageSize, превышающей 65 000.

Я обновил свою веб-конфигурацию, чтобы она выглядела так, но я думаю, что использую WCF Web Api, я думаюэто даже больше не используется, так как я больше не использую 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>

Где мне указать MaxReceivedMessageSize в новом веб-интерфейсе WCF?

Iтакже пробовал CustomHttpOperationHandlerFactory безрезультатно:

  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);
        }
    }

Ответы [ 4 ]

4 голосов
/ 24 июня 2011

maxReceivedMessageSize - это свойство, которое вы должны определить для используемой привязки. В WCF в .Net 4 введена упрощенная конфигурация, поэтому, если вы ничего не настраиваете, будут использоваться значения по умолчанию. Приведенный ниже пример действителен для wshttpBinding, вы можете изменить его в соответствии с используемой привязкой и зарегистрировать его в своем файле web.config (при условии, что вы используете службу, размещенную на IIS) в разделе привязки 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>

НТН Dominik

3 голосов
/ 24 октября 2011

Если вы размещаете хостинг в IIS, вы можете устанавливать значения там, где вы определяете маршрут (в моем случае, global.asax).Если для TransferMode установлено значение buffered (по умолчанию), вам также необходимо установить для MaxBufferSize то же значение, что и для MaxReceivedMessageSize.

protected void Application_Start()
{
   var config = new HttpConfiguration(); 
   config.MaxReceivedMessageSize = int.MaxValue;
   config.MaxBufferSize = int.MaxValue;
   RouteTable.Routes.MapServiceRoute<MyService>("api", config);
}
3 голосов
/ 13 августа 2011

Если вы пытаетесь сделать это программно (с помощью MapServiceRoute с HttpHostConfiguration.Create), то способ, которым вы это делаете, выглядит следующим образом:

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

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

NoMessageSizeLimitHostConfig - это расширение HttpConfigurableServiceHostFactory, которое выглядит примерно так::

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;
    }
}
1 голос
/ 25 июня 2011

Вот как вы можете сделать это в коде

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

Если вы создаете свой собственный хост, производный от стандартного, существует метод, который вы можете перегрузить для настройки HttpEndpoint.

...