为什么在创建 QueueTrigger WebJob 函数时会看到 FunctionIndexingException?
Why do I see a FunctionIndexingException when creating a QueueTrigger WebJob Function?
我创建了一个这样的函数
public static Task HandleStorageQueueMessageAsync(
[QueueTrigger("%QueueName%", Connection = "%ConnectionStringName%")] string body,
TextWriter logger)
{
if (logger == null)
{
throw new ArgumentNullException(nameof(logger));
}
logger.WriteLine(body);
return Task.CompletedTask;
}
队列名称和连接字符串名称来自我的配置,该配置具有用于获取值的 INameResolver
。我在应用程序启动时从我的秘密存储中放入应用程序配置的连接字符串本身。如果连接字符串是授予整个帐户所有权限的普通存储连接字符串,则该方法按预期工作。
但是,在我的场景中,我从合作伙伴团队获得了一个 SAS,它只提供对单个队列的读取访问权限。我从看起来类似于
的内容创建了一个存储连接字符串
QueueEndpoint=https://accountname.queue.core.windows.net;SharedAccessSignature=st=2017-09-24T07%3A29%3A00Z&se=2019-09-25T07%3A29%3A00Z&sp=r&sv=2018-03-28&sig=token
(我尝试在 Microsoft Azure 存储资源管理器中使用此连接字符串成功连接)
QueueTrigger
属性中使用的队列名称也是从 SAS
中收集的
但是,现在我遇到了以下异常
$exception {"Error indexing method 'Functions.HandleStorageQueueMessageAsync'"} Microsoft.Azure.WebJobs.Host.Indexers.FunctionIndexingException
InnerException {"No blob endpoint configured."} System.Exception {System.InvalidOperationException}
如果你查看连接字符串,你会发现异常是正确的。我没有配置 blob 端点。但是我也无权访问它,也不想使用它。我仅为此 QueueTrigger
.
使用存储帐户
我正在使用 Microsoft.Azure.WebJobs v2.2.0。其他依赖项阻止我升级到 v3.x
当只有对单个队列具有读取访问权限的 SAS URI 可用时,从存储队列中使用消息的推荐方法是什么?如果我已经在正确的道路上,我需要做什么才能摆脱异常?
如您所见,v2 WebJobs SDK 也需要访问 blob 端点。恐怕这是设计使然,使用像 SAS 这样没有完全访问权限的连接字符串 an improvement 已被跟踪但尚未实现。
以下是v2 SDK需要的权限。它需要获取 Blob 服务属性(Blob、Service、Read)和队列元数据并处理消息(Queue、Container&Object、Read&Process)。
Queue Trigger是获取消息,处理后删除,所以SAS需要Process权限。这意味着即使 SDK 不需要 blob 访问权限,您获得的 SAS 字符串也未正确授权。
您可以要求合作伙伴团队以上述最低权限在 Azure 门户上生成 SAS 连接字符串。如果他们不能提供 blob 访问,v3 SDK 似乎是一个可以尝试的选项。
但也存在一些问题 1. 如您所述,其他依赖项会阻止更新 2. v3 SDK 基于 .NET Core,这意味着无法避免代码更改。 3. v3 SDK文档和样例现在还在under construction.
我在获取 SAS 令牌用于 QueueTrigger 时遇到了很多问题。
没有包含 blob 是我的问题。谢谢杰瑞!
稍新的截图(我还需要添加):
我创建了一个这样的函数
public static Task HandleStorageQueueMessageAsync(
[QueueTrigger("%QueueName%", Connection = "%ConnectionStringName%")] string body,
TextWriter logger)
{
if (logger == null)
{
throw new ArgumentNullException(nameof(logger));
}
logger.WriteLine(body);
return Task.CompletedTask;
}
队列名称和连接字符串名称来自我的配置,该配置具有用于获取值的 INameResolver
。我在应用程序启动时从我的秘密存储中放入应用程序配置的连接字符串本身。如果连接字符串是授予整个帐户所有权限的普通存储连接字符串,则该方法按预期工作。
但是,在我的场景中,我从合作伙伴团队获得了一个 SAS,它只提供对单个队列的读取访问权限。我从看起来类似于
的内容创建了一个存储连接字符串QueueEndpoint=https://accountname.queue.core.windows.net;SharedAccessSignature=st=2017-09-24T07%3A29%3A00Z&se=2019-09-25T07%3A29%3A00Z&sp=r&sv=2018-03-28&sig=token
(我尝试在 Microsoft Azure 存储资源管理器中使用此连接字符串成功连接)
QueueTrigger
属性中使用的队列名称也是从 SAS
但是,现在我遇到了以下异常
$exception {"Error indexing method 'Functions.HandleStorageQueueMessageAsync'"} Microsoft.Azure.WebJobs.Host.Indexers.FunctionIndexingException
InnerException {"No blob endpoint configured."} System.Exception {System.InvalidOperationException}
如果你查看连接字符串,你会发现异常是正确的。我没有配置 blob 端点。但是我也无权访问它,也不想使用它。我仅为此 QueueTrigger
.
我正在使用 Microsoft.Azure.WebJobs v2.2.0。其他依赖项阻止我升级到 v3.x
当只有对单个队列具有读取访问权限的 SAS URI 可用时,从存储队列中使用消息的推荐方法是什么?如果我已经在正确的道路上,我需要做什么才能摆脱异常?
如您所见,v2 WebJobs SDK 也需要访问 blob 端点。恐怕这是设计使然,使用像 SAS 这样没有完全访问权限的连接字符串 an improvement 已被跟踪但尚未实现。
以下是v2 SDK需要的权限。它需要获取 Blob 服务属性(Blob、Service、Read)和队列元数据并处理消息(Queue、Container&Object、Read&Process)。
Queue Trigger是获取消息,处理后删除,所以SAS需要Process权限。这意味着即使 SDK 不需要 blob 访问权限,您获得的 SAS 字符串也未正确授权。
您可以要求合作伙伴团队以上述最低权限在 Azure 门户上生成 SAS 连接字符串。如果他们不能提供 blob 访问,v3 SDK 似乎是一个可以尝试的选项。
但也存在一些问题 1. 如您所述,其他依赖项会阻止更新 2. v3 SDK 基于 .NET Core,这意味着无法避免代码更改。 3. v3 SDK文档和样例现在还在under construction.
我在获取 SAS 令牌用于 QueueTrigger 时遇到了很多问题。
没有包含 blob 是我的问题。谢谢杰瑞!
稍新的截图(我还需要添加):