【问题标题】:How do I specify a particular endpoint with a topic/subscription in Azure ServiceBusTriggerAttribute?如何在 Azure ServiceBusTriggerAttribute 中指定具有主题/订阅的特定终结点?
【发布时间】:2020-02-21 09:20:59
【问题描述】:

我在我的 Azure 帐户中创建了一个服务总线主题 (my-topic)。我已经为该主题创建了一个只听规则 (listen_rule),并且还为该主题创建了一个订阅 (my-subscription),以便我的代码触发。

如何将特定订阅/规则添加到[ServiceBusTrigger]

在 app.config 我有这个配置部分:

<add key="MySubscription" value="my-subscription" />
<add key="MyTopic" value="Endpoint=sb://XXXXXXX.servicebus.windows.net/;SharedAccessKeyName=listen_rule;SharedAccessKey=XXXX=;EntityPath=my-topic"/>

在我的代码中:

    public async Task ProcessMyMessageAsync(
        [ServiceBusTrigger("%MyTopic%", "%MySubscription%")]
        BrokeredMessage brokeredMessage)

这会引发异常:

实体路径/名称“Endpoint=sb://XXXX.servicebus.windows.net/;SharedAccessKeyName=listen_rule;SharedAccessKey=XXXX=;EntityPath=topic”超过“50”个字符限制。

我在网上找到了很多示例,其中有一个通用的AzureWebJobsServiceBus 连接字符串,但是它可以访问整个服务总线,我想将其锁定到这个特定的主题/规则。

附言 我正在使用 .NET framework 4.5.2(是的,我知道,这是一个旧应用程序)和 Microsoft.Azure.WebJobs.ServiceBus 2.0.0。

p.p.s.理想情况下,如果可能,我想在一个配置行中指定整个订阅。

【问题讨论】:

    标签: c# azure .net-4.5 servicebus


    【解决方案1】:

    试试这个,它将你的主题名称、订阅名称和服务总线连接字符串作为参数,

    public async Task ProcessMyMessageAsync([ServiceBusTrigger("%MyTopic%","%MySubscription%", Connection = "ServiceBusEndPoint")]BrokeredMessage brokeredMessage)

    在您的应用设置中

    <add key="MySubscription" value="my-subscription" /> <add key="MyTopic" value="my-topic"/> <Add Key="ServiceBusEndPoint" value="Endpoint=sb://XXXXXXX.servicebus.windows.net/;SharedAccessKeyName=listen_rule;SharedAccessKey=XXXX="/>

    如果这不起作用,请尝试在连接字符串中添加 servicebusendpoint,而不是应该起作用的应用设置。

    Microsoft.Azure.WebJobs.ServiceBus 2.0.0 更新。

    使用可以在program.cs这里设置服务总线连接字符串和存储连接字符串

    `

        static void Main()
        {
            var config = new JobHostConfiguration("your storage connection string ");
    
            if (config.IsDevelopment)
            {
                config.UseDevelopmentSettings();
    
            }
            config.UseServiceBus(new ServiceBusConfiguration() { ConnectionString = "your servcebus connection string " });
            var host = new JobHost(config);
            // The following code ensures that the WebJob will be running continuously
            host.RunAndBlock();
        }
    `
    

    // 请在 app.config 中设置以下连接字符串以运行此 WebJob: // AzureWebJobsDashboard 和 AzureWebJobsStorage

    【讨论】:

    • Connection 在我使用的 nuget 包版本中不可用。
    • @Neil,Connection is not available in the version of the nuget package I'm using. 是什么意思?指定你的函数包版本,连接是TriggerAttribute。
    • 在问题中(接近底部),我说它是 Microsoft.Azure.WebJobs.ServiceBus 的 2.0.0 版。此版本没有“连接”参数。
    • @Neil,您正在使用服务总线触发器,它是天蓝色的功能。有关更多信息,请参阅此文档:docs.microsoft.com/en-us/azure/azure-functions/…
    • @Neil 请检查更新后的答案..如果您有任何进一步的疑问,请随时发表评论
    【解决方案2】:

    获取service bus trigger有两种方式,一种是webjob,一种是azure function。我检查了Microsoft.Azure.WebJobs.ServiceBus 2.0.0 包,看起来这个触发器不支持连接属性。

    主要是我想你想使用 webjob sdk。所以下面是我的环境。

    • Microsoft.Azure.WebJobs 2.0.0
    • Microsoft.Azure.WebJobs.Core 2.0.0
    • Microsoft.Azure.WebJobs.ServiceBus 2.0.0

    在 app.config 中,我设置了AzureWebJobsServiceBus 连接。

    <connectionStrings>
    
        <add name="AzureWebJobsDashboard" connectionString="" />
        <add name="AzureWebJobsStorage" connectionString="" />
        <add name="AzureWebJobsServiceBus" connectionString="service bus connection string"/>
      </connectionStrings>
    

    那么下面是我的Program.cs

    using Microsoft.Azure.WebJobs;
    
    namespace WebJob1
    {
    
        class Program
        {
    
            static void Main()
            {
                var config = new JobHostConfiguration();
                config.UseServiceBus();
    
                if (config.IsDevelopment)
                {
                    config.UseDevelopmentSettings();
    
                }
    
                var host = new JobHost(config);
                // The following code ensures that the WebJob will be running continuously
                host.RunAndBlock();
            }
        }
    }
    

    下面是我的Function.cs。我使用ServiceBusAccount 属性设置连接。我在这里找到它:Attributes and annotations

    using System.IO;
    using Microsoft.Azure.WebJobs;
    using Microsoft.ServiceBus.Messaging;
    
    namespace WebJob1
    {
        public class Functions
        {
    
            [ServiceBusAccount("AzureWebJobsServiceBus")]
            public static void ProcessQueueMessage([ServiceBusTrigger(topicName:"testtopic",subscriptionName:"testsub", access: AccessRights.Manage)] string message, TextWriter log)
            {
                log.WriteLine(message);
            }
        }
    }
    

    这是我的测试截图。

    如果你想要azure功能可以参考官方教程:Create your first function using Visual Studio和这个service bus binding(其他页面有触发信息)

    希望对您有所帮助,如果您还有其他问题,请随时告诉我。

    【讨论】:

    • 我需要对每个功能进行配置,而不是为整个应用程序配置一条服务总线。每个主题都有不同的 SharedAccessKeyName。
    • 所以只需在每个函数中使用具有不同键名的ServiceBusAccount。您不必使用 AzureWebJobsServiceBus 作为键名。
    • @Neil,关于这个问题的任何更新?如果这对您有帮助,您可以接受它作为答案。
    • 您的回答确实有帮助,但实际上并不是答案。 [ServiceBusAccount] 是关键,但我必须添加一个连接字符串后缀,例如:“AzureWebJobsXXXXX”
    • ServiceBusAccount 不是键,它是属性,检查我的代码,AzureWebJobsServiceBus 是键。
    【解决方案3】:

    我将自己回答这个问题,以防其他人发现这个问题:

    我缺少一个连接字符串:

    <connectionStrings>
      <add name="AzureWebJobsMyEndPoint" connectionString="Endpoint=sb://XXXX.servicebus.windows.net/;SharedAccessKeyName=listen_rule;SharedAccessKey=XXXX"/>
    </connectionStrings>
    <appSettings>
      <add key="MySubscription" value="subscription-name"/>
      <add key="MyTopic" value="topic-name"/>
    </appSetting>
    

    我需要ServiceBusAccountAttribute 触发:

    public async Task ProcessMyMessageAsync(
        [ServiceBusAccount("MyEndPoint")]
        [ServiceBusTrigger("%MyTopic%", "%MySubscription%", AccessRights.Listen)]
        BrokeredMessage brokeredMessage)
    

    注意ServiceBusAccount 如何使用MyEndPoint,但连接字符串使用它作为AzureWebJobs 的后缀。

    【讨论】:

      猜你喜欢
      • 2023-03-06
      • 1970-01-01
      • 2016-06-27
      • 1970-01-01
      • 2016-04-16
      • 1970-01-01
      • 1970-01-01
      • 2022-01-11
      • 1970-01-01
      相关资源
      最近更新 更多