簡體   English   中英

WCF可以通過線路保持引用相等嗎?

[英]Can WCF keep reference equality over the wire?

假設您定義了幾個類

[DataContract]
public class Foo
{
    [DataMember]
    public List<Bar> Bars {get; set;}
}

[DataContract]
public class Bar
{
    [DataMember]
    public string Baz { get; set; }
}

public class Service1 : IService1
{
    public bool Send(Foo foo)
    {
        var bars = foo.Bars;

        bars[0].Baz = "test2";
        return bars[0].Baz == bars[1].Baz;
    }
}

[ServiceContract]
public interface IService1
{
    [OperationContract]
    bool Send(Foo composite);
}

假設我正在使用WCF與客戶端和服務器之間的共享數據契約DLL WCF,如果我做類似以下的事情

static void Main(string[] args)
{
    using (var client = new ServiceReference.Service1Client())
    {
        var bar = new Bar();
        bar.Baz = "Start";

        List<Bar> bars = new List<Bar>();
        bars.Add(bar);
        bars.Add(bar);

        var foo = new Foo();
        foo.Bars = bars;

        Console.WriteLine(bars[0].Baz == bars[1].Baz);

        bars[0].Baz = "test1";
        Console.WriteLine(bars[0].Baz == bars[1].Baz);

        Console.WriteLine(client.Send(foo));

        Console.ReadLine();
    }

}

我得到TrueTrueFalse作為我的結果,這意味着bars[0]bars[1]沒有指向服務器上的同一個對象。

我做錯了什么,或者是不可能通過WCF共享引用?

您必須通過指定明確告訴WCF保留引用

[DataContract(IsReference = true)]

否則在消息構造期間丟失引用相等性。

DataContact注釋表示序列化。 也就是說,您的對象被序列化,通過線路傳遞,然后在另一端重新構建為新對象。 所以不,保持參考平等是不可能的。

請注意,也可能是您的WCF服務在不同的計算機上運行,​​或者至少在不同的進程上運行。 因此,WCF服務和客戶端通常甚至不能訪問相同的內存空間,這意味着在它們之間共享引用在理論上是不實際的。

暫無
暫無

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

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