【问题标题】:WCF Server get WCF client version automaticallyWCF 服务器自动获取 WCF 客户端版本
【发布时间】:2017-11-17 04:02:49
【问题描述】:

几个月前我创建了一个 WCF 服务,现在我将升级该 WCF 服务,例如添加新数据成员并删除一些数据成员,并在升级后的服务中为唯一的新 WCF 客户端执行一些额外任务,而不是老客户。

如何知道服务是被新的 WCF 客户端调用还是被旧的 WCF 客户端调用?

服务

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

实施

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

员工

[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 中添加了一个字段 ClientVersion

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 文件中进行更改,例如添加一些常量版本字段,并且当客户端向服务器发出请求时,该常量版本字段将自动发送?

【问题讨论】:

    标签: c# .net wcf


    【解决方案1】:

    您没有控制老客户。他们已经有旧的 WSDL,并且会发送没有任何新字段的消息。

    一般来说,向您的合同添加新字段是可以的 - 当您收到消息时,它们只会获得 null 值。

    但是,删除字段是危险的,因为 WCF 基础结构将无法反序列化来自旧客户端的传入消息。

    当您想要显着更改合同时使用的典型方法是在端点 URL 中引入版本控制。

    例如旧网址可能是http://yourhost.com/YourService/,新网址是http://yourhost.com/YourServiceV2/,可以使用新合同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多