2016-12-25 55 views
2

我试图使用Azure WebJobs SDK在消息发布到队列上时触发函数。AzureWebjobSDK中的StorageConnectionString是否需要访问整个存储帐户?

使用存储帐户密钥将StorageConnectionString设置为连接字符串时,可以正常工作。

我想在StorageConnectionString但得到的错误使用共享访问令牌(SAS),其中有到该队列访问(和只):

Message=Failed to validate Microsoft Azure WebJobs SDK Storage connection string. The Microsoft Azure Storage account connection string is not formatted correctly. Please visit http://msdn.microsoft.com/en-us/library/windowsazure/ee758697.aspx for details about configuring Microsoft Azure Storage connection strings.

和:

Message=The account credentials for '' are incorrect. 
    Source=Microsoft.Azure.WebJobs.Host 
    StackTrace: 
     at Microsoft.Azure.WebJobs.Host.Executors.DefaultStorageCredentialsValidator.<ValidateCredentialsAsyncCore>d__4.MoveNext() 

我使用的连接字符串格式如下: BlobEndpoint = https://myaccount.blob.core.windows.net/;QueueEndpoint=https://myaccoount.queue.core.windows.net/queuename;SharedAccessSignature=token

任何机会StorageConnectionString要求访问整个存储帐户?如果是这样,你有一个想法我可以做什么?

+0

我很确定它可以在连接字符串中使用SAS:https://docs.microsoft.com/en-us/azure/storage/storage-configure-connection-string#create-a-connection- string-using-a-shared-access-signature – 4c74356b41

+0

是的,我知道可以在连接字符串中使用SAS。问题是Azure WebJob SDK是否允许在连接字符串中使用SAS,该连接字符串仅向队列授予权限 –

回答

0

查看WebjobSDK代码:https://github.com/Azure/azure-webjobs-sdk/tree/dev/src它看起来像是您所面临的异常由存储帐户解析器抛出。看代码,它解析如下:

public static StorageAccountParseResult TryParseAccount(string connectionString, out CloudStorageAccount account) 
    { 
     if (String.IsNullOrEmpty(connectionString)) 
     { 
      account = null; 
      return StorageAccountParseResult.MissingOrEmptyConnectionStringError; 
     } 

     CloudStorageAccount possibleAccount; 
     if (!CloudStorageAccount.TryParse(connectionString, out possibleAccount)) 
     { 
      account = null; 
      return StorageAccountParseResult.MalformedConnectionStringError; 
     } 

     account = possibleAccount; 
     return StorageAccountParseResult.Success; 
    } 

我查了你的格式发送使用CloudStorageAccount,似乎传递。请注意,在blob端点后面有一个不必要的'/',也许你缺少一些文本,导致解析失败。

0

根据你的描述,我遵循这个官方document来配置Azure存储连接字符串。偶尔我遇到了你提到的错误:The account credentials for '' are incorrect.

据我所知,Azure WebJobs SDK会引用Azure存储客户端库,它是Azure存储服务REST API的封装。对于类似问题的疑难解答,您可以利用Fiddler来捕获网络软件包。下面是截图,当我通过提琴手抓住了上述错误:

Any chance StorageConnectionString requires access to the whole storage account? If so, do you have an idea what I could do?

我认为有与您的连接字符串是错误的。

QueueEndpoint= https://myaccoount.queue.core.windows.net/queuename

这里是我的连接字符串,其中包括我的WebJob项目中的BLOB和队列存储帐户SAS,你可以参考一下吧。

<add name="AzureWebJobsStorage" connectionString="BlobEndpoint=https://brucechen01.blob.core.windows.net/;QueueEndpoint=https://brucechen01.queue.core.windows.net/;SharedAccessSignature=sv=2015-12-11&amp;ss=bq&amp;srt=sco&amp;sp=rwdlacup&amp;se=2016-12-31T18:39:25Z&amp;st=2016-12-25T10:39:25Z&amp;spr=https&amp;sig={signature}" />

注:如果您在配置文件中的连接字符串中指定一个SAS,则可能需要在通过HTML编码的URL特殊字符进行编码。

UPDATE:

正如你在下面My SAS includes permissions to the queue with the "queuename" only注释中。由于您已为Blob和队列配置了SAS令牌,因此我认为您需要为blob和队列服务创建帐户SAS令牌。您可以利用Microsoft Azure Storage Explorer创建SAS令牌,如下所示:

选择您的存储帐户,右键单击并选择“获取共享访问签名”。

注:当更换的SharedAccessSignature与生成的SAS令牌的价值,你需要删除您的SAS令牌第一?符号。

+0

感谢您的回答。我的SAS仅包含“queuename”队列的权限。这种情况对你有用吗? –

+0

我测试过这个场景,请求如下所示:https://myaccount.queue.core.windows.net/queuename/queuename?{sasToken},然后出现以下错误:“400请求的URI不代表任何资源在服务器上“。根据我的理解,'QueueEndpoint'是您队列存储的基地址,您无法使用特定的队列对其进行配置。 –

+0

WebJob SDK为您提供了一种处理存储操作的简单方法。对于您的场景,您可以放弃WebJob SDK并尝试利用存储客户端库自行实现队列或Blob的触发器。此外,你可以发布你的反馈[这里](https://feedback.azure.com/forums/34192--general-feedback)。 –

相关问题