如何在Azure Service Bus中序列化异常?

时间:2017-06-30 08:52:18

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

我正在尝试将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:Exception   执行函数时:Functions.ProcessQueueMessage2Async --->   System.Runtime.Serialization.InvalidDataContractException:Type   'MyException'无法序列化。考虑用它标记它   DataContractAttribute属性,并标记其所有成员   想要使用DataMemberAttribute属性进行序列化。如果是这种类型   是一个集合,考虑用它来标记它   CollectionDataContractAttribute。请参阅Microsoft .NET Framework   其他支持类型的文档。

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

  

Microsoft.Azure.WebJobs.Host.FunctionInvocationException:Exception   执行函数时:Functions.ProcessQueueMessage2Async --->   System.Runtime.Serialization.InvalidDataContractException:Type   'MyException'不能是ISerializable并且具有DataContractAttribute   属性。

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

1 个答案:

答案 0 :(得分:4)

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

所以你有两个选择:

  1. 使用其他序列化程序序列化您的异常(然后将Stream传递给BrokeredMessage构造函数)。有关选项,请参阅this question

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