我创建了一个用于记录异常的WCF服务(我意识到如果网络出现故障,就不会记录任何内容......有回退的地方)
无论如何,它有两种方法
int LogException(MethodBase methodBase, Exception exception)
int LogMessage(MethodBase methodBase, string message, string data)
当我尝试将服务添加到新项目时,不会创建.cs文件。我运行了svcutil,并将.cs和config设置复制到项目中,并尝试使用生成的客户端调用服务。我收到以下两个错误
尝试时出错 序列化参数 http://tempuri.org/:methodBase。该 InnerException消息是'Type 'System.Reflection.RuntimeMethodInfo' 与数据合同名称 'RuntimeMethodInfo:HTTP://schemas.datacontract.org/2004/07/System.Reflection' 不是预期的。考虑使用 DataContractResolver或添加任何类型 静态地不知道列表 已知类型 - 例如,通过使用 KnownTypeAttribute属性或 将它们添加到已知类型列表中 传递给DataContractSerializer。'。 有关更多信息,请参阅InnerException 的信息。
内部异常
类型 'System.Reflection.RuntimeMethodInfo' 与数据合同名称 'RuntimeMethodInfo:HTTP://schemas.datacontract.org/2004/07/System.Reflection' 不是预期的。考虑使用 DataContractResolver或添加任何类型 静态地不知道列表 已知类型 - 例如,通过使用 KnownTypeAttribute属性或 将它们添加到已知类型列表中 传递给DataContractSerializer。
我需要做些什么来完成这项工作?
答案 0 :(得分:5)
通过WCF进行通信时,WCF需要准确了解将跨边界发送的内容。所以采用“异常”是好的,但几乎总是,你将传递异常的子类型,所以你需要告诉合约哪些类型的异常将通过边界传递。 MethodBase也是如此。你可能想告诉它你实际上会在某些时候传递一个MethodInfo。
因为这些不是您的类型,您可能无法使用KnownType属性(该属性通常放在基类或接口上)。在这种情况下,您需要使用数据合同解析器。它告诉序列化/反序列化引擎如何查找子类型。
http://msdn.microsoft.com/en-us/library/ee358759.aspx
虽然您可以使用ServiceKnownType属性。你的合同应该是这样的:
[DataContract]
public interface ILoggingStuff // choose a better name than this
{
[OperationContract]
[ServiceKnownType(typeof(MethodInfo))]
int LogException(MethodBase methodBase, Exception exception);
[OperationContract]
[ServiceKnownType(typeof(MethodInfo))]
int LogMessage(MethodBase methodBase, string message, string data);
}
这告诉WCF,MethodBase可能正在使用降序类型MethodInfo。