簡體   English   中英

如何使用單個WCF服務支持不同的客戶端

[英]How to support different clients with single WCF service

我需要返回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架構幫助也將更有幫助。

如果不同的客戶有不同的需求,那么正確的做法就是創建不同的服務。

您將業務邏輯放入共享的業務類中(或分布在多個共享的業務類中),並針對不同類型的客戶端公開不同的服務。 這樣可以使一切保持良好,抽象和安全的狀態,並且沒有人獲得不需要或不需要的數據。

在此鏈接上有非常相似的討論。 基本上,它指的是有條件地隱藏數據成員的值。

您可以根據客戶端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類將基於IsSSNSerializable屬性的值公開SSN

[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;
        }
    }
}

我建議您閱讀WCF版本控制策略,該策略可能與您的方案相匹配。

就我而言,我在數據合同上實現了IExtensibleDataObject並在這一層而不是服務合同層進行管理。

缺點是很難跟蹤不同版本的合同,但是我正在練習半嚴格版本控制,對我來說效果很好。

我第二個是Roy,但是如果這是客戶端A和客戶端B之間的唯一區別。公開帶有參數IsSSNRequired的GetEmployee方法(可以具有默認的false值)不會有任何問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM