繁体   English   中英

Microsoft.Azure.ServiceBus.Message 不能用作 Azure Function 上的返回类型 Z303160EF9EDB9072D

[英]Microsoft.Azure.ServiceBus.Message cannot be used as Azure Function return type on .NET 6.0?

I have just upgraded my Azure Functions from .NET Core 3.1 to .NET 6.0, the Azure Functions runtime from v3 to v4, and upgraded all package references accordingly to the latest version, including:

  • Microsoft.NET.Sdk.Functions 4.0.1
  • Microsoft.Azure.Functions.Extensions 1.1.0
  • Microsoft.Azure.WebJobs.Extensions.ServiceBus 5.1.0
  • Microsoft.Azure.ServiceBus 5.2.0

我的一些功能现在开始出错。 下面是一个简单的可重现示例:

public class MyTimerFunction
{
    [FunctionName(nameof(MyTimerFunction))]
    [return: ServiceBus("MyQueue", Connection = "ServiceBusConnectionString")]
    public Message Run(
        [TimerTrigger("0 * * * * *")] TimerInfo timer,   // Runs every 1 minute
        CancellationToken cancellationToken)
    {
        var bytes = Encoding.UTF8.GetBytes("Hello world!");
        var message = new Message(bytes) { SessionId = "MySession" };
        return message;
    }
}

这是我得到的错误:

System.Private.CoreLib:执行 function 时出现异常:MyTimerFunction。 Microsoft.Azure.WebJobs.Host:在 function 返回后处理参数 $return 时出错:。 Newtonsoft.Json:从“Microsoft.Azure.ServiceBus.Message”上的“ExpiresAtUtc”获取值时出错。 Microsoft.Azure.ServiceBus:由于 object 的当前 state,操作无效。

Message返回类型的绑定似乎被破坏了。 由于SessionId ,我需要使用Message (而不是直接返回有效负载)。 Microsoft 的最新文档仍然使用此Message class: Azure Service Bus output binding for Z3A580F142203677F589 函数

我知道已经发布了一个新的Azure.Messaging.ServiceBus库来替换Microsoft.Azure.ServiceBus ,但我更愿意先在旧库上解决这个问题。

我在Azure 服务总线 output 绑定的 Azure 函数文档中发现了答案:

使用 5.0.0 或更高版本的服务总线扩展的应用程序使用Azure.Messaging.ServiceBus中的ServiceBusMessage类型,而不是Microsoft.Azure.ServiceBus命名空间中的类型。 此版本放弃了对旧Message类型的支持,转而支持以下类型: ServiceBusMessage

在这种情况下,“服务总线扩展”是指Microsoft.Azure.WebJobs.Extensions.ServiceBus ,它本身引用Azure.Messaging.ServiceBus 因此,我的 function 已经间接使用了这个新库。 解决方案是将返回类型从Message更改为ServiceBusMessage

using Azure.Messaging.ServiceBus;   // new namespace
…

public class MyTimerFunction
{
    [FunctionName(nameof(MyTimerFunction))]
    [return: ServiceBus("MyQueue", Connection = "ServiceBusConnectionString")]
    public ServiceBusMessage Run(
        [TimerTrigger("0 * * * * *")] TimerInfo timer)   // Runs every 1 minute
    {
        var bytes = Encoding.UTF8.GetBytes("Hello world!");
        var message = new Message(bytes) { SessionId = "MySession" };
        return message;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM