连接属性在 Azure ServiceBus 订阅触发的函数中不起作用

Posted

技术标签:

【中文标题】连接属性在 Azure ServiceBus 订阅触发的函数中不起作用【英文标题】:Connection Property does not work in Azure ServiceBus Subscription-triggered Function 【发布时间】:2021-12-29 16:34:47 【问题描述】:

根据the documentation,可以在ServiceBus触发的函数中指定一个Connection。连接应引用该名称的应用设置,其中包含与 Azure ServiceBus 命名空间的连接字符串。

我有一个包含有效 Azure ServiceBus 连接字符串的应用设置,并且 Connection 参数设置为设置名称。但是,该功能不会触发。它在本地工作,或者如果我使用默认设置名称“AzureWebJobsServiceBus”。显然我不想使用这个名字,因为我可能有多个连接。

应用设置:

功能代码:

FunctionName("Test")]
public static async Task Run([ServiceBusTrigger("topicname", "subscriptionname", Connection = "AzureWebJobsTestConn", IsSessionsEnabled = true)]

我也试过了:

FunctionName("Test")]
public static async Task Run([ServiceBusTrigger("topicname", "subscriptionname", Connection = "TestConn", IsSessionsEnabled = true)]

我看到了一些相关的问题,但通常给出的答案是确保使用应用程序设置,而不是某些配置文件 - 我就是这样。

任何帮助将不胜感激!

【问题讨论】:

【参考方案1】:

我尝试通过以下步骤重现您的问题:

    首先,我通过 Azure 门户创建了一个服务总线名称空间和一个队列

    创建了 Azure 函数 项目,其中 Http Trigger 模板和授权级别为匿名。 我还将我的函数文件从function1.cs 重命名为SendMessage.cs 并替换了链接服务总线队列的代码,记下请求中读取的消息数。

代码:

using System.IO;
using System.Text;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Azure.WebJobs.ServiceBus;
using Microsoft.EntityFrameworkCore.Metadata.Internal;
using Microsoft.Extensions.Logging;

namespace KrishSBFuncApp1

     public static class SendMessage
        
            [FunctionName("SendMessage")]
            [return: ServiceBus("krishqueue", Connection = "AzureWebJobsServiceBus")]
            public static async Task<string> Run(
                [HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = null)] HttpRequest req,
                ILogger log)
            
                log.LogInformation("SendMessage function requested");
                string body = string.Empty;
                using (var reader = new StreamReader(req.Body, Encoding.UTF8))
                
                    body = await reader.ReadToEndAsync();
                    log.LogInformation($"Message body : body");
                
                log.LogInformation($"SendMessage processed.");
                return body;
                    
                
               

    local.settings.json 文件中,将你的服务总线命名空间共享访问策略主连接字符串复制到任意字符串中(这里我将其命名为"AzureWebJobsServiceBus":&lt;rootmanagesharedaccesskey-conn-string&gt;

    我在 azure 函数应用配置 设置中添加了相同的连接字符串,如下所示:

使用 Postman 进行本地测试: 在 Visual Studio 中构建并运行应用程序 > 你将获得一个 API。 将该 API URL 复制到邮递员并输入正文。

在将函数应用部署/发布到 azure 后使用 Azure Functions URL 进行测试:

    Azure 门户 > 函数应用 > 单击函数(在左侧索引窗格中)> 选择您的函数 > 单击代码+测试(在左侧索引窗格中)。 您可以通过 Test/Run 选项或在 postman 中运行应用程序。 我以两种方式执行,如下图所示,它可以区分您了解哪个输出属于哪个输出。

我已将正文作为 Hello Dear Krishna 并在 postman 中发送请求,另一次我通过 Test/Run 选项执行通过将正文作为Hello Krishna 来提供蔚蓝门户。

队列数为:

【讨论】:

感谢您的详细分析!这与我的问题无关,原因有两个:1. 我正在实现一个 ServiceBus 触发的函数,该函数应该由放置在队列中的消息触发 - 而不是将消息排入队列的函数,2. 整个问题发生在使用名称不同于“AzureWebJobsServiceBus”的应用设置 我已经提供了如何在函数代码和 azure 函数应用程序(门户)中配置 AzureWebJobsServiceBus 的信息。请检查一次。 我以为您使用的是由消息触发的服务总线连接。如果您在使用 ServiceBusTrigger 时需要该解决方案,我将尝试解决并提供该信息。

以上是关于连接属性在 Azure ServiceBus 订阅触发的函数中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Azure.Messaging.ServiceBus SDK 中“UserProperties”属性的等效项

使用 Azure.ServiceBus.Messaging C# SDK for SAS 令牌的服务总线连接字符串

如何使用Azure Event Grid向GCP提供的事件

使用订阅的 Azure 服务总线队列

如何在 Azure Function 中使用 Azure Managed Identity 通过触发器访问 Service Bus?

Azure ServiceBus:找不到“com.microsoft.azure.servicebus.ITopicClient”