我正在尝试将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
。我该如何解决这个问题?
答案 0 :(得分:4)
您将无法使用DataContractSerializer
序列化您的例外。即使您成功地使用DataContract
标记了您的类,内部异常也可以是任何类型,因此不兼容。
所以你有两个选择:
使用其他序列化程序序列化您的异常(然后将Stream
传递给BrokeredMessage
构造函数)。有关选项,请参阅this question。
我认为通过电线发送异常本身并不是很干净。我宁愿创建一个自定义消息,其中包含对消费者很重要的所有信息,然后将此消息发送到服务总线。