如何使用单个WCF服务支持不同的客户端

时间:2012-12-17 14:28:49

标签: c# wcf wcf-data-services

我需要返回Employee类作为对clientA的响应,如下所示。

[OperationContract]

    public Employee GetEmployee(String id)
    {
    ..
    ..
    return emp;
    }

    public class Employee 
    {
    public string Name;
    public string phoneNo;
    }

但问题是clientB将消耗我的服务,但需要员工的SSN。如果我将它添加到Employee类中,我将发送给clientA,它不需要它。如何克服这种情况。如果我必须对自定义反序列化做任何事情,如果我要处理1000个属性,这不是一个问题吗?

哪种解决方案更好?任何wcf架构帮助也会更有帮助。

4 个答案:

答案 0 :(得分:1)

如果不同的客户有不同的需求,那么正确的方法是创建不同的服务。

您将业务逻辑放在共享业务类中(或分布在多个共享业务类上),并为每种不同类型的客户端公开不同的服务。这样可以保持良好,抽象和安全,并且没有人获得他们不需要或不想要的数据。

答案 1 :(得分:1)

对此link的讨论非常相似。基本上,它指的是条件隐藏数据成员的值。

您可以根据客户端ID或凭据(应将其作为参数传递给服务方法调用)来决定是否要公开数据成员。

[OperationContract]
public Employee GetEmployee(int clientId, String id)
{
    var employee = new Employee();

    //here you might use a mapping table between the clients and the exposed data members
    if (clientId == 1)
    {
        employee.IsSSNSerializable = true;
    }
    return employee;
}

Employee类会根据SSN属性的值公开IsSSNSerializable

[DataContract]
public class Employee
{
    public bool IsSSNSerializable = false;

    [DataMember]
    public string Name;
    [DataMember]
    public string phoneNo;

    public string SSN;

    [DataMember(Name = "SSN", EmitDefaultValue = false)]
    public string SSNSerializable
    {
        get
        {
            if (!IsSSNSerializable)
                return null;
            return SSN;
        }
        set
        {
            SSN = value;
        }
    }
}

答案 2 :(得分:1)

我建议您阅读可能与您的方案匹配的versioning strategies of the WCF

对于我的情况,我在数据契约上实现了IExtensibleDataObject,并在此层而不是服务契约层进行管理。

缺点是跟踪不同版本的合同会有困难,但是我正在练习半严格版本,对我来说效果很好。

答案 3 :(得分:0)

我是第二个Roy,但是如果这是客户端A和B之间的唯一区别。使用参数IsSSNRequired公开可能具有默认false值的GetEmployee方法也没有坏处。