【问题标题】:Serializing MethodBase and Exception types in a WCF Service在 WCF 服务中序列化 MethodBase 和异常类型
【发布时间】:2011-05-07 08:03:42
【问题描述】:

我创建了一个用于记录异常的 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' 带有数据合同名称 '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。

我需要做什么才能完成这项工作?

【问题讨论】:

    标签: .net wcf service datacontractserializer


    【解决方案1】:

    当通过 WCF 进行通信时,WCF 需要准确地知道要跨边界发送什么。因此,采用“异常”很好,但几乎总是,您将传递异常的子类型,因此您需要告诉合约哪些类型的异常将被传递越界。 MethodBase 也是如此。您可能想告诉它您实际上有时会传递 MethodInfo。

    因为这些不是您的类型,您可能无法使用 KnownType 属性(该属性通常放置在基类或接口上)。在这种情况下,您需要使用 Data Contract Resolver。它告诉序列化/反序列化引擎如何找到子类型。

    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。

    【讨论】:

    • @McKay,我把这个放在哪里?
    • 对不起,轻微的记忆失误,你不能使用 KnownType,因为它们不是你的类型(我在考虑错误合约,它放在数据合约上)
    • 我还发现这个blogs.msdn.com/b/sowmy/archive/2006/06/06/… 提到它适用于异常,但我不知道将 dataContractSerializer/dataTypes 配置信息放在哪里...在 svc 或消费应用程序中?
    • @Chad:你正在一点一点地学习,为什么不传递你无法控制的数据,尤其是特定于平台的类型。一旦 .NET 开始使用您传递的类型之一的不同子类型,您的代码就会中断。一般来说,这是行不通的。您需要决定 MethodBase 的哪些部分,以及您对 Exception 的哪些部分感兴趣,然后传递这些部分。
    • 是的,这就是我最终所做的。不过这似乎是个 hack,因为我已经有了一个包含我想要的一切的对象......嗯。
    猜你喜欢
    • 2011-05-06
    • 1970-01-01
    • 2010-12-17
    • 2012-11-28
    • 2014-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-22
    相关资源
    最近更新 更多