WCF - Quản lý phiên bản
Tập hợp các kỹ thuật được WCF sử dụng để ràng buộc một tập hợp các thông báo (yêu cầu của khách hàng) với các cá thể dịch vụ được gọi là Quản lý phiên bản. WCF hỗ trợ ba kiểu kích hoạt phiên bản và chúng sẽ được thảo luận trong chương này.
Dịch vụ cho mỗi cuộc gọi
Dịch vụ theo cuộc gọi là chế độ kích hoạt phiên bản mặc định của WCF. Khi một dịch vụ WCF được cấu hình cho một dịch vụ mỗi cuộc gọi, một đối tượng CLR sẽ được tạo cho khoảng thời gian mà một cuộc gọi hoặc yêu cầu của khách hàng đang diễn ra. CLR là viết tắt của Common Language Runtime và nó bao gồm các phiên bản dịch vụ trong WCF.
Trong dịch vụ mỗi cuộc gọi, mọi yêu cầu của khách hàng đều đạt được phiên bản dịch vụ chuyên dụng mới và mức tiêu thụ bộ nhớ của nó ít hơn so với các kiểu kích hoạt phiên bản khác.
Thuộc tính InstanceContextMode bắt buộc phải được đặt thành InstanceContextMode.PerCall, để chỉ ra một dịch vụ WCF hoạt động như một dịch vụ theo cuộc gọi. Thuộc tính InstanceContextMode thuộc thuộc tính ServiceBehavior. Do đó, một dịch vụ cho mỗi cuộc gọi có thể được cấu hình như sau:
[ServiceContract]
interface IMyContract
{...}
[ServiceBehavior (InstanceContextMode = InstanceContextMode.PerCall)]
class MyService : IMyContract
{...}
Một dịch vụ ở đây được biểu thị là IMyContract. Hình sau cho thấy quá trình kích hoạt phiên bản dịch vụ cho mỗi cuộc gọi.
Triển khai dịch vụ cho mỗi cuộc gọi
[DataContract]
class Param {....}
[ServiceContract]
interface IMyContract {
[OperationContract]
void MyMethod(Param objectIdentifier);
}
class MyPerCallService : IMyContract, IDisposable {
public void MyMethod(Param objectIdentifier) {
GetState(objectIdentifier);
DoWork();
SaveState(objectIdentifier);
}
void GetState(Param objectIdentifier) {....}
void DoWork() {....}
void SaveState(Param objectIdentifier) {....}
public void Dispose() {....}
}
Ở đây, Param là tham số kiểu giả được phát minh cho ví dụ trên.
Dịch vụ mỗi phiên
Trong chế độ kích hoạt này của WCF, một phiên riêng tư hay có thể nói là một phiên bí mật được duy trì giữa hai thực thể, tức là máy khách và một cá thể dịch vụ cụ thể. Còn được gọi là dịch vụ phiên riêng tư, dịch vụ mỗi phiên cung cấp một phiên bản dịch vụ mới vẫn dành riêng cho từng yêu cầu của khách hàng và tự chủ đối với tất cả các phiên bản khác liên quan đến dịch vụ nhận biết phiên đó.
Để bắt đầu một dịch vụ mỗi phiên, thuộc tính InstanceContextMode được yêu cầu đặt thành PerSession. Tại đây, phiên bản dịch vụ sẽ nằm trong bộ nhớ trong suốt thời lượng phiên.
Chế độ kích hoạt bị ảnh hưởng bởi khả năng mở rộng vì dịch vụ đã định cấu hình không thể hỗ trợ bất kỳ ứng dụng khách nổi bật nào khác ngoài một số ít (hoặc có thể lên đến hàng trăm) do chi phí liên quan đến mỗi phiên bản dịch vụ chuyên dụng này.
Dịch vụ mỗi phiên có thể được định cấu hình như sau:
[ServiceBehavior (InstanceContextMode = InstanceContextMode.PerSession)]
class MyService : IMyContract
{...}
Quá trình của dịch vụ mỗi phiên có thể được mô tả như trong hình sau:
Đoạn mã sau đây hiển thị một hợp đồng và dịch vụ được định cấu hình để sử dụng phiên riêng tư. Kết quả đầu ra chỉ ra rằng máy khách thực sự có một phiên bản dịch vụ chuyên dụng.
Mã dịch vụ
[ServiceContract(Session = true)]
interface IMyContract {
[OperationContract]
void MyMethod();
}
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
class MyService : IMyContract, IDisposable {
int m_Counter = 0; MyService() {Console.WriteLine("MyService.MyService()"); }
public void MyMethod() {
m_Counter++;
Console.WriteLine("Counter = " + m_Counter);
}
public void Dispose() {
Console.WriteLine("MyService.Dispose()");
}
}
Mã khách hàng
MyContractProxy proxy = new MyContractProxy(); proxy.MyMethod(); proxy.MyMethod();
proxy.Close();
Đầu ra
MyService.MyService() Counter = 1 Counter = 2 MyService.Dispose()
Dịch vụ Singleton
Trong chế độ kích hoạt này của WCF, tất cả các yêu cầu của khách hàng độc lập với nhau sẽ được kết nối với cùng một phiên bản đơn lẻ nổi tiếng, bất kể kết nối của chúng với các điểm cuối dịch vụ. Dịch vụ singleton chỉ được xử lý khi máy chủ đóng cửa.
Dịch vụ này chỉ được tạo một lần khi máy chủ được tạo. Trong trường hợp, máy chủ không được cung cấp bất kỳ phiên bản singleton nào, dịch vụ sẽ trả về dưới dạng NULL. Chế độ kích hoạt ở mức tốt nhất khi khối lượng công việc trong mỗi lệnh gọi phương thức là ít và không có hoạt động đang chờ xử lý nào ở chế độ nền.
Thuộc tính InstanceContextMode được yêu cầu đặt thành InstanceContextMode.Single để bắt đầu dịch vụ Singleton này.
Do đó, một dịch vụ Singleton có thể được định cấu hình như sau:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
class MySingleton : ...
{...}
Quy trình của dịch vụ Singleton được thể hiện trong hình sau:
Đoạn mã sau được sử dụng để khởi tạo và lưu trữ một phiên bản singleton.
Mã dịch vụ
[ServiceContract]
interface IMyContract {
[OperationContract]
void MyMethod( );
}
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
class MySingleton : IMyContract {
int m_Counter = 0;
public int Counter {
get {
return m_Counter;
}
set {
m_Counter = value;
}
}
public void MyMethod( ) {
m_Counter++;
Trace.WriteLine("Counter = " + Counter);
}
}
Mã máy chủ
MySingleton singleton = new MySingleton( );
singleton.Counter = 42;
ServiceHost host = new ServiceHost(singleton);
host.Open( );
//Do some blocking calls then
host.Close( );
Mã khách hàng
MyContractClient proxy = new MyContractClient( );
proxy.MyMethod( );
proxy.Close( );
Đầu ra
Counter = 43