【问题标题】:How to serialize an exception in Azure Service Bus?如何序列化 Azure 服务总线中的异常?
【发布时间】:2017-12-04 04:12:50
【问题描述】:

我正在尝试将 WebJob 执行的结果发送到响应队列:

        var message = new BrokeredMessage(exception);
        outputMessages.Add(message);

我的异常类代表一个逻辑错误:

public class MyException : Exception{
    public MyException(){}
    public MyException(string message) : base(message){}
    public MyException(string message, Exception inner) : base(message, inner){}
    protected MyException(SerializationInfo info, StreamingContext context) : base(info, context){}

    public object MyProp { get; set; }
}

但是,我得到以下异常:

Microsoft.Azure.WebJobs.Host.FunctionInvocationException:异常 执行功能时:Functions.ProcessQueueMessage2Async ---> System.Runtime.Serialization.InvalidDataContractException:类型 'MyException' 不能被序列化。考虑用 DataContractAttribute 属性,并标记您的所有成员 想要使用 DataMemberAttribute 属性进行序列化。如果类型 是一个集合,考虑用 集合数据合同属性。请参阅 Microsoft .NET 框架 其他受支持类型的文档。

当我用[DataContract] 标记MyException 时,我得到了这个:

Microsoft.Azure.WebJobs.Host.FunctionInvocationException:异常 执行功能时:Functions.ProcessQueueMessage2Async ---> System.Runtime.Serialization.InvalidDataContractException:类型 “MyException”不能是 ISerializable 并且具有 DataContractAttribute 属性。

可能是因为System.Exception 实现了ISerializable。我该如何解决?

【问题讨论】:

  • “向响应队列发送异常 [...]” - 接收者真的需要整个异常 object 吗?或者使用.ToString()、状态码或一些自定义消息包会更好吗?
  • 恐怕我不能使用字符串或枚举,因为我需要传递其他信息(在我的示例中为MyProp)以正确格式化 UI 上的错误消息。

标签: c# .net serialization azure-webjobs azureservicebus


【解决方案1】:

您将无法使用DataContractSerializer 序列化您的异常。即使你成功地用DataContract 标记了你的类,内部异常也可以是任何类型,因此不兼容。

所以你有两个选择:

  1. 使用另一个序列化程序序列化您的异常(然后将Stream 传递给BrokeredMessage 构造函数)。请参阅this question 了解一些选项。

  2. 我认为通过网络发送异常本身并不是很干净。我宁愿创建一条自定义消息,其中包含对消费者重要的所有信息,然后将此消息发送到服务总线。

【讨论】:

    猜你喜欢
    • 2015-02-25
    • 1970-01-01
    • 2015-06-26
    • 1970-01-01
    • 2015-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多