EventArgs无法在WCF,通用回调事件中序列化

时间:2017-08-02 14:42:21

标签: c# wcf generics events callback

假设这些数据合同:

[DataContract] 
public class TestTabularPoint_C 
{
    [DataMember]
    public string Modality { get; set; }

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

    [DataMember]
    public string PatientName { get; set; } 
    public TestTabularPoint_C()
    {

    }
}

[DataContract]
[KnownType(typeof(TestTabularPoint_C))]
[KnownType(typeof(TestTabularPlot_DTO))]
[KnownType(typeof(IEnumerable<TestTabularPoint_C>))]
public class TestTabularPlot_DTO : EventArgs
{
    [DataMember]
    public IEnumerable<TestTabularPoint_C> TestTabularPoints { get; set; } 
}

完整会话双工服务中的回调事件:

public event EventHandler<EventArgs> FigureDataSetLoaded; 
    public void OnFigureDataSetLoad(EventArgs dto)
    {
        FigureDataSetLoaded?.Invoke(this, dto);
    }

最后测试方法:

 [TestMethod]
    public void Test_Tabular_Plot_Based_Cloud()
    {
        DispatcherClient dc = new DispatcherClient(new DispatcherCallBack(), "dispatcherEndPoint", Internals.SYSTEM, Cluster);
        Task.Run(() =>
        {
            ManualResetEvent ev = new ManualResetEvent(false); 
            dc.FigureDataSetLoaded += (s, e) =>
            {
                TestTabularPlot_DTO dtoOut = (TestTabularPlot_DTO)e;
                Console.WriteLine(dtoOut.TestTabularPoints.Count());
            };
            var res = dc.TestTabularPlot(new ModalityReport_DTO_IN()
            {
                From = DateTime.Now.AddYears(-50),
                To = DateTime.Now
            });
            ev.WaitOne();
        }).Wait(dc.Endpoint.Binding.ReceiveTimeout);
    }

调试上面的测试方法时,FigureDataSetLoaded事件没有引发,调试器转到CCU !!!!并且没有回复,但当我更改该事件以通知客户TestTabularPlot_DTO时,它不是从EventArgs派生的,一切正常,

在我移除KnownType属性的另一边,异常被引发为:

  

输入&#39; x.TestTabularPlot_DTO&#39;使用数据合同名称&#39; TestTabularPlot_DTO:http://schemas.datacontract.org/2004/07/x&#39;不是预期的。如果您正在使用DataContractSerializer或者将任何静态未知的类型添加到已知类型列表中,请考虑使用DataContractResolver - 例如,通过使用KnownTypeAttribute属性或将它们添加到传递给序列化程序的已知类型列表中。

1-为什么来自EventArgs的派生类无法序列化,解决方案是什么?

2-有没有办法在WCF中使用通用回调事件?

这样:

 public event EventHandler<T> FigureDataSetLoaded;

并通过一个事件将不同的DTO传递给客户。

提前致谢。

0 个答案:

没有答案