我创建了这样的函数
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 Storage Explorer中使用此连接字符串成功连接)
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可用时,推荐的从存储队列使用消息的方法是什么?如果我已经走上正确的道路,那么该怎么做才能摆脱异常?
答案 0 :(得分:2)
您已经看到,v2 WebJobs SDK也需要访问blob端点。恐怕是设计使然,使用了没有完全访问权限的连接字符串,例如已跟踪an improvement但尚未实现SAS。
以下是v2 SDK所需的权限。它需要获取Blob服务属性(Blob,服务,读取)和队列元数据并处理消息(队列,容器和对象,读取和处理)。
队列触发器用于获取消息并在处理后将其删除,因此SAS需要具有处理权限。这意味着即使SDK不需要Blob访问,您获得的SAS字符串也没有得到正确的授权。
您可以要求合作伙伴团队在Azure门户上以上述最低权限生成SAS连接字符串。如果他们不能提供Blob访问,则可以尝试使用v3 SDK。
但是有一些问题1.如您所述,其他依赖项阻止更新2. v3 SDK基于.NET Core,这意味着无法避免代码更改。 3. v3 SDK文档和示例目前仍为under construction。
答案 1 :(得分:0)