代码之家  ›  专栏  ›  技术社区  ›  CaffGeek

在WCF服务中序列化MethodBase和异常类型

  •  1
  • CaffGeek  · 技术社区  · 14 年前

    我创建了一个用于记录异常的WCF服务(我意识到如果网络关闭,事情将不会被记录…有回退到位)

    不管怎样,它有两种方法

    int LogException(MethodBase methodBase, Exception exception)
    int LogMessage(MethodBase methodBase, string message, string data)
    

    当我尝试将服务添加到新项目时,不会创建.cs文件。我运行了svcutil,将.cs和配置设置复制到项目中,并尝试使用生成的客户机调用服务。我有以下两个错误

    尝试时出错 序列化参数 http://tempuri.org/:methodBase . 这个 InnerException消息是“类型” 'System.Reflection.RuntimeMethodInfo' 带数据合同名称 '运行时方法信息:http://schemas.datacontract.org/2004/07/system.reflection' 不是预期的。考虑使用 DataContractResolver或添加任何类型 不知道的静态列表 已知类型-例如,通过使用 KnownTypeAttribute属性或 将它们添加到已知类型的列表中 传递到DataContractSerializer。“”。 有关更多信息,请参阅InnerException。 细节。

    有内部异常

    类型 'System.Reflection.RuntimeMethodInfo' 带数据合同名称 '运行时方法信息:http://schemas.datacontract.org/2004/07/system.reflection' 不是预期的。考虑使用 DataContractResolver或添加任何类型 不知道的静态列表 已知类型-例如,通过使用 KnownTypeAttribute属性或 将它们添加到已知类型的列表中 传递到DataContractSerializer。

    我需要做些什么才能使这个工作成功?

    1 回复  |  直到 14 年前
        1
  •  5
  •   McKay    14 年前

    当通过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。