2017-11-13 9 views
0

私は数か月前に1つのWCFサービスを作成しましたが、新しいデータメンバーの追加や一部のデータメンバーの削除などのWCFサービスをアップグレードし、古いクライアント用ではない唯一の新しいWCFクライアントです。WCFサーバーはWCFクライアントのバージョンを自動的に取得します

サービスが新しいWCFクライアントまたは古いWCFクライアントによって呼び出されたことをどのように知ることができますか?

サービス

[ServiceContract] 
public interface IService1 
{ 
    void Insert(WCFClientInfo wcfClientInfo, Employee employee); 
} 

Implementaion

public class Service1 : IService1 
{ 
    public void Insert(WCFClientInfo wcfClientInfo, Employee employee) 
    { 
     // My Task 
    } 
} 

従業員

[DataContract] 
public class Employee 
{ 
    [DataMember(Order = 1)] 
    public int ID { get; set; } 

    [DataMember(Order = 2)] 
    public string Name { get; set; } 

    [DataMember(Order = 3)] 
    public string MobileNo { get; set; } 
} 

WCFClientInfo

[DataContract] 
public class WCFClientInfo 
{ 
    [DataMember] 
    public string UserName { get; set; } 

    [DataMember] 
    public string Password { get; set; } 
} 

今、Employeeデータ契約の新しいフィールドを追加するのはEMailです。そのために私はWCFClientInfoに1つの以上のフィールドClientVersionを追加するよう

従業員

[DataContract] 
public class Employee 
{ 
    [DataMember(Order = 1)] 
    public int ID { get; set; } 

    [DataMember(Order = 2)] 
    public string Name { get; set; } 

    [DataMember(Order = 3)] 
    public string MobileNo { get; set; } 

    [DataMember(Order = 4)] 
    public string EMail { get; set; } 
} 

は、だから今、私は、WCFクライアントのユーザーが古いか新しいものであるかを知りたいです。

WCFClientInfo

[DataContract] 
public class WCFClientInfo 
{ 
    [DataMember] 
    public string UserName { get; set; } 

    [DataMember] 
    public string Password { get; set; } 

    [DataMember] 
    public string ClientVersion { get; set; } 
    // It must be filled automatically by the WCF client 
    // Means no need to provide by the client manually. 
} 

新しい実装は:

public void Insert(WCFClientInfo wcfClientInfo, Employee employee) 
{ 
    if (string.IsNullOrWhiteSpace(wcfClientInfo.ClientVersion) || 
     wcfClientInfo.ClientVersion == "V1.0.0") 
    { 
     SendSMS(employee.MobileNo); 
    } 
    else if (wcfClientInfo.ClientVersion == "V2.0.0") 
    { 
     SendEMail(employee.EMail); 
    } 
} 

だから以前WCFClientInfoクラスにはClientVersionフィールドが存在しませんが、アップグレードされたWCFサービスでClientVersionフィールドがましだろう。

ここで問題は、ClientVersionクラスのWCFクライアントバージョンが自動的に必要で、クライアントとして手動で渡す必要があることです。

クライアントのWSDLファイルにいくつかの定数バージョンフィールドを追加するなどの変更を加えてもかまいません。クライアントがサーバーに要求を出したときに自動的に送信されますか?

答えて

0

あなたは古いクライアントを制御していません。彼らはすでに古いWSDLを持っており、新しいフィールドなしでメッセージを送信します。

通常、契約に新しいフィールドを追加することはOKです。メッセージを受け取った時点で、値はnullになります。

ただし、WCFインフラストラクチャは古いクライアントからの着信メッセージを逆シリアル化できないため、フィールドを削除することは危険です。

契約を大幅に変更する場合に使用する典型的なアプローチは、エンドポイントURLにバージョン管理を導入することです。

など。古いURLはhttp://yourhost.com/YourService/、新しい契約はhttp://yourhost.com/YourServiceV2/となります。