2009-10-09 37 views
5

Thư viện dịch vụ WCF của tôi được lưu trữ dưới dạng Dịch vụ Windows và được cho là xử lý các yêu cầu từ nhiều máy khách. Một yêu cầu mà khách hàng sẽ thực hiện thường xuyên là khá nhiều tài nguyên.WCF - Yêu cầu xử lý từ nhiều máy khách

Tôi có hai nghi ngờ liên quan đến scenerio trên:

  1. Làm thế nào một dịch vụ WCF xử lý yêu cầu nhiều khách hàng?
  2. Có cấu hình WCF nào để làm cho quy trình có hiệu quả không?

Cảm ơn bạn!

Trả lời

11

Trong trường hợp mặc định của bạn, máy chủ dịch vụ WCF (thứ lưu trữ lớp dịch vụ của bạn) sẽ tạo một phiên bản mới của lớp dịch vụ cho mỗi yêu cầu đi kèm và cho phép xử lý yêu cầu (kích hoạt "mỗi cuộc gọi").

Bạn có thể tinh chỉnh số lượng tối đa các phiên bản lớp dịch vụ hoạt động đồng thời này bằng cách sử dụng hành vi serviceThrottling trên máy chủ của bạn.

<system.serviceModel> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="ThrottledServiceBehavior"> 
      <serviceThrottling 
       maxConcurrentCalls="25" 
       maxConcurrentSessions="25" 
       maxConcurrentInstances="25"/> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 

Có giải thích thực sự tốt về các tùy chọn về hành vi điều chỉnh dịch vụ và giá trị mặc định của nó trong số blog post here của Kenny Wolf.

Ngoài ra, thiết lập của InstanceContextModeConcurrencyMode trên lớp dịch vụ của bạn (thực hiện hợp đồng dịch vụ) có ảnh hưởng mạnh đến cách dịch vụ của bạn sẽ xử lý đồng thời và nhiều yêu cầu.

[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall, 
       ConcurrencyMode=ConcurrencyMode.Single)] 
class YourServiceClass : IYourService 
{ 
    ..... 
} 

InstanceContextMode nên PerCall (mỗi yêu cầu gọi được một mới, trường hợp riêng biệt) và sau đó ConcurrencyMode có thể Single (đó là dễ dàng nhất để phát triển).

InstanceContextMode cũng có thể là PerSession nếu bạn cần một cách tiếp cận dựa trên phiên (không phải là rất phổ biến), hoặc Single (lớp dịch vụ của bạn sẽ một singleton - được khuyến khích không sử dụng này, trừ khi bạn hoàn toàn, tích cực phải và biết về tất cả các quirks và các vấn đề với nó!).

ConcurrencyMode cũng có thể là Reentrant (chỉ liên quan đến hợp đồng song công và ràng buộc) hoặc Multiple (lớp dịch vụ đa luồng đa luồng - rất nguy hiểm và khó phát triển!).

Marc

Các vấn đề liên quan