首页 文章

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

提问于
浏览
1

我有一个问题是在.NET核心2.0中使用 Queue Trigger 创建 Azure Function .

我想要什么

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

问题

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

Visual Studio Add New Project

New Template 我选择 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

警告:在local.settings.json中找不到名为“https://MyDevServiceBus.servicebus.windows.net”的值,该值与'C:\ Projects \ CustomerProfile.AzureService \ bin \中'queueTrigger'上设置的'connection'属性相匹配调试\ netstandard2.0 \功能1 \ function.json” . 您可以运行'func azure functionapp fetch-app-settings'或在local.settings.json中指定连接字符串 . [12/03/2018 12:10:41]读取主机配置文件'C:\ Projects \ CustomerProfile.AzureService \ bin \ Debug \ 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,版本= 2.0.11353.0,ProcessId = 8992,Debug = False,Attempt = 0,FunctionsExtensionVersion = beta)在http:// localhost上侦听:7071 /按CTRL-C退出... [12/03/2018 12:10:42]发生ScriptHost错误[12/03/2018 12:10:42] Microsoft.Azure.WebJobs.Host:错误索引方法'Function1.Run' . Microsoft.Azure.WebJobs.Host:Microsoft Azure WebJobs SDK“QueueConnection”连接字符串缺失或为空 . 可以通过以下方式设置Microsoft Azure存储帐户连接字符串:[12/03/2018 12:10:42] 1.在.config文件的connectionStrings部分中以下列格式设置名为“AzureWebJobsQueueConnection”的连接字符串或者[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”连接字符串缺失或为空 . 可以通过以下方式设置Microsoft Azure存储帐户连接字符串:[12/03/2018 12:10:42] 1.在.config文件的connectionStrings部分中以下列格式设置名为“AzureWebJobsQueueConnection”的连接字符串或者[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存储帐户连接字符串:[12/03/2018 12:10:42] 1.在.config文件的connectionStrings部分中以下列格式设置名为“AzureWebJobsQueueConnection”的连接字符串或者[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 回答

  • 5

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

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

    我建议暂时使用函数v1作为Service Bus .

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

    • ServiceBusTrigger 放在函数定义中 .

    • 添加一个名为 MyServiceBusConnection 的设置(或您喜欢的任何其他名称) . 将其设置为 sb://myservicebus.servicebus.windows.net/;...

    • 从触发定义中引用设置名称,例如 [ServiceBusTrigger("myqueue", AccessRights.Manage, Connection = "MyServiceBusConnection")]

  • 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}");
            }
        }
    }
    

相关问题