2011-06-24 16 views
6

Tôi đang sử dụng khuôn khổ WCF Web Api 4.0 và đang chạy vào maxReceivedMessageSize đã vượt quá 65.000 lỗi.C# WCF Web Api 4 MaxReceivedMessageSize

Tôi đã cập nhật webconfig của mình trông như thế này nhưng vì tôi đang sử dụng Web Api WCF, tôi nghĩ rằng điều này thậm chí không còn được sử dụng nữa vì tôi không còn sử dụng webHttpEndpoint nữa?

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

Tôi chỉ định MaxReceivedMessageSize trong WCF Web Api mới ở đâu?

Tôi cũng đã thử một CustomHttpOperationHandlerFactory vô ích:

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

Trả lời

3

Nếu bạn đang cố gắng để làm điều này programatically (thông qua sử dụng MapServiceRoute với HttpHostConfiguration.Create) cách bạn làm điều đó là như thế này:

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

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

Các NoMessageSizeLimitHostConfig là một phần mở rộng của HttpConfigurableServiceHostFactory trông giống như sau:

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

các maxReceivedMessageSize là một tài sản mà bạn phải xác định trên you're ràng buộc sử dụng. WCF trong .Net 4 giới thiệu cấu hình đơn giản, vì vậy nếu bạn không cấu hình bất cứ điều gì, giá trị mặc định sẽ được sử dụng. Ví dụ dưới đây là hợp lệ cho wshttpBinding, bạn có thể chèn nó theo ràng buộc đã sử dụng của bạn và đăng ký nó trong web.config của bạn (giả sử bạn đang sử dụng dịch vụ lưu trữ IIS) trong phần ràng buộc 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

không thể làm việc này với dịch vụ của mình –

+0

Xin chào nextgenneo, bạn có quản lý để chạy mã cho đến bây giờ không? – Dominik

1

Đây là cách bạn có thể làm điều đó trong mã

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

Nếu bạn tạo một máy chủ riêng của bạn, xuất phát từ một tiêu chuẩn, có một phương pháp mà bạn có thể quá tải để cấu hình HttpEndpoint.

+0

Tôi thực sự đặt mã này ở đâu? Tôi không biết máy chủ ở đâu. Tôi đã thử đặt nó trong HttpOperationHandlerFactory OnCreateRequestHandlers của tôi nhưng chỉ có quyền truy cập vào điểm cuối. –

+0

@nextgenneo Ahh, bạn không tự lưu trữ. Điểm tốt. Không chắc. Tôi sẽ cho bạn biết nếu tôi tìm ra. –

+0

Có cách nào để tăng điều này cho mỗi API hoặc cho mỗi Bộ điều khiển không? Tôi không muốn mở kích thước tin nhắn cho toàn bộ API? –

3

Nếu bạn đang lưu trữ trong IIS, bạn có thể đặt giá trị khi bạn xác định tuyến đường (trong trường hợp của tôi là global.asax). Nếu bạn có TransferMode được đặt thành đệm (mặc định), bạn cũng sẽ cần đặt MaxBufferSize với cùng giá trị là MaxReceivedMessageSize.

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