如何在 Azure ServiceBusTriggerAttribute 中指定具有 topic/subscription 的特定终结点?

How do I specify a particular endpoint with a topic/subscription in Azure ServiceBusTriggerAttribute?

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

如何将特定的 subscription/rule 添加到 [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)

这会引发异常:

The entity path/name 'Endpoint=sb://XXXX.servicebus.windows.net/;SharedAccessKeyName=listen_rule;SharedAccessKey=XXXX=;EntityPath=topic' exceeds the '50' character limit.

我在网上找到了很多例子,其中有一个通用的 AzureWebJobsServiceBus 连接字符串,但它可以访问整个服务总线,我想将它锁定到这个特定的 topic/rule.

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

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

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

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="/>

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

更新 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();
    }
`

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

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

我想您主要想使用 webjob sdk。下面是我的环境。

  • Microsoft.Azure.WebJobs 2.0.0
  • Microsoft.Azure.WebJobs.核心 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 and this service bus binding(其他页面有触发信息)

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

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

我缺少连接字符串:

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