2012-06-13 27 views
5

Câu hỏi này liên quan đến dữ liệu tĩnh trong một lớp.Vòng đời của dịch vụ WCF được lưu trữ trong IIS

Nếu đó là một lớp dịch vụ thì tôi nghĩ chế độ instantiating là quan trọng. Nhưng điều gì xảy ra nếu tôi có một lớp singleton độc lập khác?

Tôi có thể tạo đối tượng ở đó sẽ có sẵn cho tất cả cuộc gọi cho mỗi cuộc gọi không? Liệu IIS có dll đó trong bộ nhớ mãi mãi để singleton sẽ là tất cả thời gian trong bộ nhớ?

Làm thế nào tôi có thể làm cho một số đối tượng khả dụng cho tất cả các cuộc gọi của khách hàng WCF? Có thể làm điều đó trong IIS hoặc tôi nên lưu trữ các dịch vụ WCF trong một cửa sổ dịch vụ?

Trả lời

2

Đã kiểm tra sự cố trong IIS cục bộ của tôi.

Đây là mã của tôi.

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)] 
public class Service : IService 
{ 

    public static int _counter = 0; 

    public string GetData() 
    { 
     _counter++; 
     return _counter.ToString(); 
    } 
} 

Với cấu hình IIS mặc định, một quy trình chạy trên mỗi ứng dụng và mã này hoạt động như mong đợi. Kết quả được tăng lên trong mọi cuộc gọi dịch vụ.

Điều này có ý nghĩa vì InstanceContextMode không quản lý luồng. Nó chỉ kiểm soát tuổi thọ của cuộc đời là InstanceContext.

Biết rằng chúng tôi vẫn không thể xem xét sử dụng các biến tĩnh cho dữ liệu có thể thay đổi được như là phương pháp hay nhất. IIS có thể được cấu hình là "Web Garden". Cấu hình đó có nghĩa là có nhiều hơn một quy trình làm việc được phép cho mỗi nhóm ứng dụng và mọi quá trình sẽ có bản sao biến tĩnh riêng của nó.

http://www.iis.net/ConfigReference/system.applicationHost/applicationPools

Làm thế nào tôi có thể làm cho một số đối tượng có sẵn cho tất cả các cuộc gọi của khách hàng WCF? Có thể thực hiện điều đó trong IIS hoặc tôi có nên lưu trữ dịch vụ WCF trong dịch vụ cửa sổ không?

Đối tượng phải được lưu trữ trong lưu trữ liên tục như cơ sở dữ liệu hoặc bộ nhớ cache được phân phối. IIS vẫn là một máy chủ tuyệt vời cho các dịch vụ và nó cung cấp mọi thứ mà dịch vụ windows có thể làm cộng thêm nhiều hơn nữa.

2

sẽ cung cấp một số gợi ý dựa trên bối cảnh ngắn mà bạn cung cấp

  • Nếu bạn có một lớp tĩnh, nhà nước được duy trì miễn là bạn có quyền truy cập vào cùng một Proxy WCF. Máy chủ (IIS hoặc dịch vụ Windows) không quan trọng.

  • Nếu bạn muốn duy trì 'biến tĩnh toàn cầu' trên các yêu cầu của khách hàng, tại sao bạn không lưu trữ chúng trong một kho lưu trữ (tệp/cơ sở dữ liệu/v.v.)?

  • Nếu bạn muốn giữ trạng thái cho từng yêu cầu của khách hàng, bạn có thể xem xét 'Dịch vụ WCF bền' (related thread). Tôi đã sử dụng nó trước đó - do đó, nó hoạt động được cung cấp kịch bản của bạn yêu cầu phiên như hành vi và nhận thức được chi phí hiệu suất.

Hy vọng điều này sẽ hữu ích.

+0

Tôi không nhận được điểm đầu tiên (ý của bạn là gì: cùng một proxy wcf?) Điểm thứ hai, bởi vì tôi muốn tải một số dữ liệu từ db và phân phối nó cho khách hàng (tốc độ có liên quan). Các dịch vụ bền vững, mặt khác, theo như tôi biết, hãy sử dụng cookie để lưu trữ dữ liệu phiên của khách hàng. Vì vậy, lưu trữ một wcf trong một cửa sổ dịch vụ sự lựa chọn đúng để đi? – John

+1

@ John - Trong điểm đầu tiên, bởi 'WCF proxy', tôi có nghĩa là đối tượng được tạo ở phía máy khách để truy cập dịch vụ. Vì vậy, giả sử bạn sử dụng một proxy WCF để thực hiện một số cuộc gọi dịch vụ, lớp tĩnh (ở phía máy chủ) sẽ vẫn như cũ. Tôi sẽ không tư vấn cho điều này trừ khi các cuộc gọi dịch vụ có liên quan. Về câu hỏi thứ hai của bạn, tôi thích ý tưởng sử dụng dịch vụ Windows để duy trì các biến toàn cục. Đã không sử dụng nó trước đây, nhưng hãy thử. – Channs

+0

Tôi hiểu điều đó. Cảm ơn bạn đã gợi ý. – John

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