2011-06-24 21 views
6

WCF Web Api 4.0 çerçevesini kullanıyorum ve maxReceivedMessageSize uygulamasında 65.000 hatası aştım.C# WCF Web Api 4 MaxReceivedMessageSize

Webconfig'imi bu şekilde görmek için güncelledim, ancak WCF Web API'sini uyandırdığım için artık bir webHttpEndpoint kullanmadığım için bunun artık kullanılmadığını düşünüyorum.

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

Nereden yeni WCF Web Api MaxReceivedMessageSize belirtebilirim?

Ben de boşuna bir CustomHttpOperationHandlerFactory denedim:

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

cevap

3

yapmanız böyle oldu:

NoMessageSizeLimitHostConfig gibi görünür HttpConfigurableServiceHostFactory bir uzantısıdır
IHttpHostConfigurationBuilder httpHostConfiguration = HttpHostConfiguration.Create(); //And add on whatever configuration details you would normally have 

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

: IIS içinde barındıran varsa

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

MaxReceivedMessageSize kullanmakta bağlayıcı açık olmuş üzerinde tanımlamak zorunda bir özelliktir. WCF in .Net 4 basitleştirilmiş yapılandırmayı tanıttı, böylece hiçbir şey yapılandırmazsanız, varsayılan değerler kullanılır. Aşağıdaki örnek wshttpBinding için geçerli olup, kullandığınız bağlama göre değişiklik gösterip, web.config'inize (IIS tarafından barındırılan bir hizmet kullandığınızı varsayarak) servicemodel-binding bölümünde kaydedin.

<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

havn't bu benim hizmetleriyle çalışacak şekilde almak mümkün olmuştur –

+0

Selam nextgenneo, kodunuz şu ana kadar çalışır duruma nasıl başardınız? – Dominik

1

Bu standart birinden türetilmiş bir kendi özel ev sahibi, oluşturursanız kod

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

bunu nasıl yapabilirim, orada bir HttpEndpoint'i yapılandırmak için aşırı yükleyebileceğiniz yöntem. Yol (HttpHostConfiguration.Create ile MapServiceRoute kullanarak aracılığıyla) programlama yoluyla bunu yapmak için çalışıyorsanız

+0

Bu kodu nereye koyarım? Ev sahibinin nerede olduğunu bilmiyorum. HttpOperationHandlerFactory OnCreateRequestHandlers ürününe koymayı denedim, ancak yalnızca son noktaya erişime sahip oldum. –

+0

@nextgenneo Ahh, siz kendiniz ev sahip değilsiniz. İyi bir nokta. Emin değil. Öğrenirsem haber vereceğim. –

+0

Bu API veya Denetleyici başına bunu artırmak için bir yolu var mı? Tüm API için mesaj boyutunu açmak istemiyorum? –

3

, size rota tanımlamak hiç değerlerini (benim durumumda, global.asax) belirleyebilirsiniz. TransferMode arabelleğe alınmış (varsayılan) olarak ayarlanmışsa, MaxBufferSize değerini de MaxReceivedMessageSize ile aynı değere ayarlamanız gerekir.

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