如何在Azure ServiceBusTriggerAttribute中使用主题/订阅指定特定的终结点?

时间:2020-02-21 09:20:59

标签: c# azure .net-4.5 servicebus

我已经在我的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连接字符串,但是可以访问整个服务总线,我想将其锁定在这个特定的主题/规则中。 / p>

p.s。 我正在使用.NET Framework 4.5.2(是的,我知道,它是一个旧应用程序)和Microsoft.Azure.WebJobs.ServiceBus 2.0.0。

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

3 个答案:

答案 0 :(得分:0)

尝试一下,它将您的主题名称,订阅名称和servicebus连接字符串作为参数,

Finance Admin Rahul

以及您的应用设置

Note: You should click 'run' button to execute the program.

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

Microsoft.Azure.WebJobs.ServiceBus 2.0.0的更新。

use可以在program.cs中在此处设置服务总线连接字符串和存储连接字符串

`

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

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

答案 1 :(得分:0)

有两种获取服务总线触发器的方法,一种是webjob,另一种是Azure函数。我检查了Microsoft.Azure.WebJobs.ServiceBus 2.0.0软件包是否看起来像该触发器不支持connection属性。

大多数情况下,我想您想使用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);
        }
    }
}

这是我的测试屏幕截图。

enter image description here

如果您要使用天蓝色函数,可以参考官方教程:Create your first function using Visual Studio和此service bus binding(其他页面包含触发信息)

希望这可以为您提供帮助,如果您还有其他问题,请随时告诉我。

答案 2 :(得分:0)

如果其他人发现此问题,我将自己回答:

我缺少连接字符串:

<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 的后缀。