Azure 函数的服务总线队列触发器:此操作需要管理声明

ServiceBus Queue Trigger For Azure Function: Manage claim is required for this operation

编辑这个问题写于 2016 年,因此可能不再相关

我刚刚创建了一个简单的函数应用程序,其中有一个函数应该在新消息添加到队列时触发(门户函数)

我使用 "ServiceBusQueueTrigger - C#" 模板创建了我的函数,因此代码如下所示:

using System;
using System.Threading.Tasks;

public static void Run(string myQueueItem, TraceWriter log)
{
    log.Verbose($"C# ServiceBus queue trigger function processed message: {myQueueItem}");
}

我在 Azure 门户中收到此错误:

Microsoft.ServiceBus: The remote server returned an error: (401) Unauthorized. Manage claim is required for this operation. TrackingId:6e27fe40-f667-4230-9995-d09f2ac67f35_G17,TimeStamp:4/18/2016 10:17:41 PM. System: The remote server returned an error: (401) Unauthorized.

一开始,我使用共享访问策略设置了我的连接字符串,该策略只允许侦听队列并将其更改为管理声明,但我仍然遇到此错误。

要解决此问题,我必须设置与 RootManageSharedAccessKey 的连接,以提供对服务总线命名空间的完全访问权限

是 normal/desired 行为吗?将来是否可以设置具有不同共享访问策略的连接字符串?

如果未指定,则默认使用 AccessRights AccessRights.Manage。您可以使用高级门户编辑器覆盖它,指定更受限制的 AccessRights 值:

{
  "bindings": [
    {
      "type": "serviceBusTrigger",
      "direction": "in",
      "accessRights": "listen",
      "queueName": "samples-input"
    }
  ]
}

我们需要通过第一个 class 门户 UI 公开此值,以便更容易配置。

我的解决方案稍微简单一些,我采用的方法是使用一个 app.config 文件和一个连接字符串到我的 ServiceBus 存储在设置中:

<add name="AzureWebJobsServiceBus" value="e.t.c."/>

而且我在服务总线值中输入了错误的值。在哪里可以找到这些东西并不是很明显,因为自从我上次查看以来 Azure 已经改变了一些东西。如需指导,请转至服务总线的命名空间(搜索服务总线,然后 select 您的命名空间),然后选择共享访问策略。在那里你应该找到你的共享访问密钥,你可以将这个服务总线值复制到你的应用程序配置中(注意并注意实际生产密钥的源代码安全......)我的共享密钥是为管理发送设置的听着,我刚才抄错了...

使用自定义 AccessRights 值以这种方式声明触发函数:

    public async Task MyFunction([ServiceBusTrigger(MyQueueName, Microsoft.ServiceBus.Messaging.AccessRights.Listen)] Message message, TextWriter log)