Azure 函数 v2 中的中转消息发送和消息使用者



>我有模拟 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">反序列化类型对象时出错。输入源的格式不正确。

BrokeredMessageMessage在 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属性中使用字节数组并滚动自己的序列化程序/扩展方法。

最新更新