>我有模拟 azure Web 作业,它们会定期将BrokeredMessage
推送到服务总线主题,如下所示
public void Simulate(
[TimerTrigger("0 */30 * * * *", RunOnStartup = true)]
TimerInfo timerInfo,
[ServiceBus("%topic%")]
out BrokeredMessage message)
{
message = new BrokeredMessage(
new AwesomeContract()
{
});
}
在 azure 函数 V2 中,我尝试使用类Message
使用它。
public static void Integrate(
[ServiceBusTrigger(
"%topic%",
"%subscribtion%",
Connection = "ServiceBusConnection")] Message message,
TraceWriter log,
ExecutionContext context)
{
try
{
message.GetBody<AwesomeContract>();
}
}
GetBody<>
我收到异常DataContractSerialization
">反序列化类型对象时出错。输入源的格式不正确。
BrokeredMessage
和Message
在 Azure 函数 v1 和 v2 中是否兼容?有什么建议吗?
BrokeredMessage
是来自库WindowsAzure.ServiceBus的消息对象,其中Message
是来自库Microsoft.Azure.ServiceBus的对象。
即使这些库之间的对象类型不同,将消息正文作为Stream
发送也将有助于在读取正文时克服异常。
message = new BrokeredMessage(new MemoryStream(Encoding.UTF8.GetBytes([message_body]));
如上所述构造消息会有所帮助。
我在尝试为类似问题寻求帮助时偶然发现了以下互操作类:Microsoft.Azure.ServiceBus.Extensions.MessageInterOpExtensions.cs注意:文档中的示例都假定你有权访问消息接收器,而在 Azure 函数中,您很可能无法访问。
根据那里的评论,您的特定配置应该可以工作,但显然那里存在一些未知错误 - 您可能需要滚动自己的扩展,或者查看是否可以使用该消息。正文字节[]属性
自定义对象的 BrokeredMessage 构造函数说它正在使用带有二进制 XmlDictionaryWriter 的 DataContractSerializer,所以如果我们知道内容类型是什么,我们也许能够看到 DataContractSerializer 失败的原因。
如果所有其他方法都失败了,或者在修复这个明显的错误之前,您可能需要查看是否可以在Body属性中使用字节数组并滚动自己的序列化程序/扩展方法。