Azure Service Bus和Azure功能队列触发器

时间:2018-03-12 13:02:21

标签: c# azure .net-core azure-functions azureservicebus

我在.NET核心2.0中使用Azure Function创建Queue Trigger时遇到问题。

我想要什么

microservice体系结构中,当在队列中创建用于创建用户的新消息时,服务必须接收此消息并根据其中的信息在数据库中创建用户。

问题

在Visual Studio 2017中,我在Azure Function下创建了一个新项目。

Visual Studio Add New Project

新模板中选择Queue Trigger

Visual Studio New Template

此屏幕与Microsoft post有关此主题的不同。无论如何,第一个问题是ConnectionPath是什么。

我创建了一个Service Bus,我的凭据来自Azure Portal。我复制了Primary Connection StringPath是我的队列名称。

如果我运行该项目,我会收到很多错误。我在Azure Documentation上找到simple trigger的此链接。在此示例中,他们使用ServiceBusTrigger而不是QueueTrigger。为了解析ServiceBusTrigger,我在Nuget中添加了Microsoft.Azure.WebJobs.ServiceBus。它似乎不起作用。

Azure Portal Service Bus

要为Azure Function获取正确的凭据,我在Azure Portal创建了一个并下载了app content

Azure Portal Function

看起来像是

{
  "IsEncrypted": false,
  "Values": {
    "FUNCTIONS_EXTENSION_VERSION": "beta",
    "ScmType": "None",
    "WEBSITE_AUTH_ENABLED": "False",
    "AzureWebJobsDashboard": "DefaultEndpointsProtocol=https;AccountName=my;AccountKey=something",
    "WEBSITE_NODE_DEFAULT_VERSION": "6.5.0",
    "WEBSITE_CONTENTAZUREFILECONNECTIONSTRING": "DefaultEndpointsProtocol=https;AccountName=my;AccountKey=something",
    "WEBSITE_CONTENTSHARE": "createprofile-98873b60",
    "WEBSITE_SITE_NAME": "CreateProfile",
    "WEBSITE_SLOT_NAME": "Production",
    "AzureWebJobsStorage": "DefaultEndpointsProtocol=https;AccountName=createprofil8796;AccountKey=something"
  },
  "configurationSource": "config",
  "bindings": [
    {
      "type": "serviceBusTrigger",
      "connection": "sb://myservicebus.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=something",
      "queueName": "testqueue",
      "accessRights": "manage",
      "name": "myQueueItem",
      "direction": "in"
    }
  ]
}

这是我的错误页面

Error Page

  

警告:找不到名称的值   'https://MyDevServiceBus.servicebus.windows.net'in   local.settings.json匹配'connection'属性设置   'queueTrigger'中   'C:\项目\ CustomerProfile.AzureService \ BIN \调试\ netstandard2.0 \功能1 \ function.json'。   您可以运行'func azure functionapp fetch-app-settings   '或指定连接字符串   local.settings.json。 [12/03/2018 12:10:41]阅读主机配置   文件   'C:\项目\ CustomerProfile.AzureService \ BIN \调试\ netstandard2.0 \ host.json'   [12/03/2018 12:10:41]主机配置文件读取:[12/03/2018   12:10:41] {[12/03/2018 12:10:41]} [12/03/2018 12:10:42]生成1   工作职能[12/03/2018 12:10:42]开始主持人   (HostId = desktop7fksikf-631144646,Version = 2.0.11353.0,ProcessId = 8992,   Debug = False,Attempt = 0,FunctionsExtensionVersion = beta)正在听   http://localhost:7071/按CTRL-C退出... [12/03/2018 12:10:42] A.   发生ScriptHost错误[12/03/2018 12:10:42]   Microsoft.Azure.WebJobs.Host:错误索引方法'Function1.Run'。   Microsoft.Azure.WebJobs.Host:Microsoft Azure WebJobs SDK   “QueueConnection”连接字符串缺失或为空。微软   可以在以下设置Azure存储帐户连接字符串   方法:[12/03/2018 12:10:42] 1.设置名为的连接字符串   'AzureWebJobsQueueConnection'在connectionStrings部分中   .config文件格式如下,或[12/03/2018 12:10:42] 2.设置名为的环境变量   'AzureWebJobsQueueConnection',或[12/03/2018 12:10:42] 3.设置   JobHostConfiguration的相应属性。 [12/03/2018 12:10:42]   错误索引方法'Function1.Run'[12/03/2018 12:10:42]   Microsoft.Azure.WebJobs.Host:错误索引方法'Function1.Run'。   Microsoft.Azure.WebJobs.Host:Microsoft Azure WebJobs SDK   “QueueConnection”连接字符串缺失或为空。微软   可以在以下设置Azure存储帐户连接字符串   方法:[12/03/2018 12:10:42] 1.设置名为的连接字符串   'AzureWebJobsQueueConnection'在connectionStrings部分中   .config文件格式如下,或[12/03/2018 12:10:42] 2.设置名为的环境变量   'AzureWebJobsQueueConnection',或[12/03/2018 12:10:42] 3.设置   JobHostConfiguration的相应属性。 [12/03/2018 12:10:42]   找不到工作职能。尝试制作你的工作类和方法   上市。如果您正在使用绑定扩展(例如ServiceBus,Timers,   确保你已经调用了注册方法   你的启动代码中的扩展名(例如config.UseServiceBus(),   config.UseTimers()等)。 [12/03/2018 12:10:42]工作主持人开始了   [12/03/2018 12:10:42]以下1个函数出错:   [12/03/2018 12:10:42]运行:Microsoft.Azure.WebJobs.Host:错误   索引方法'Function1.Run'。 Microsoft.Azure.WebJobs.Host:   Microsoft Azure WebJobs SDK的“QueueConnection”连接字符串是   丢失或空着。 Microsoft Azure存储帐户连接   string可以通过以下方式设置:[12/03/2018 12:10:42] 1.设置   中的连接字符串名为“AzureWebJobsQueueConnection”   .config文件的connectionStrings部分采用以下格式   ,或[12/03/2018 12:10:42] 2.设置名为的环境变量   'AzureWebJobsQueueConnection',或[12/03/2018 12:10:42] 3.设置   JobHostConfiguration的相应属性。 [12/03/2018 12:10:42]   [12/03/2018 12:10:42] [12/03/2018 12:10:42]获得主机锁定租约   按实例ID“000000000000000000000000E37F5049”。

这种Azure Function的正确实施是什么? GitHub上有什么例子吗?提前谢谢。

2 个答案:

答案 0 :(得分:7)

您正在混淆Azure Service Bus和Azure存储队列。 Queue Trigger用于存储队列,因此Connection是存储帐户的连接字符串,Path是队列路径。

要使用Service Bus,您应该使用Service Bus Trigger。在.NET Core / v2版本的函数上设置该函数需要花费更多的精力,因为Visual Studio工具尚不可用。

我建议暂时使用函数v1作为服务总线。

ServiceBusTrigger是要使用的正确类型。您应将其Connection属性设置为包含Service Bus连接字符串的设置名称,而不是连接字符串本身。因此

  1. ServiceBusTrigger放在您的函数定义上。
  2. 添加名为MyServiceBusConnection的设置(或您喜欢的任何其他名称)。将其设置为sb://myservicebus.servicebus.windows.net/;...
  3. 从触发器定义中引用设置名称,例如[ServiceBusTrigger("myqueue", AccessRights.Manage, Connection = "MyServiceBusConnection")]

答案 1 :(得分:0)

由于您在评论中提到您在查找服务总线队列触发器模板时遇到问题,这就是它的样子 - 正如Mikhail在他的回答中提到的那样,用应用程序的名称填写Connection=""设置具有连接字符串

enter image description here

using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host;
using Microsoft.ServiceBus.Messaging;

namespace FunctionApp11
{
    public static class Function2
    {
        [FunctionName("Function2")]
        public static void Run([ServiceBusTrigger("myqueue", AccessRights.Manage, Connection = "")]string myQueueItem, TraceWriter log)
        {
            log.Info($"C# ServiceBus queue trigger function processed message: {myQueueItem}");
        }
    }
}