假设这些数据合同:
[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传递给客户。
提前致谢。