Azure Functions 使用输入和输出绑定在本地开发

Azure Functions develop locally with input and output bindings

看Visual Studio2017年开发Azure Functions的例子,可以看到可以用触发器建立一个新的函数模板。

因此对于队列,模板如下:

using System;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host;

namespace FunctionApp1
{
    public static class Function1
    {
        [FunctionName("QueueTriggerCSharp")]        
        public static void Run([QueueTrigger("myqueue-items", Connection = "QueueStorage")]string myQueueItem, TraceWriter log)
        {
            log.Info($"C# Queue trigger function processed: {myQueueItem}");
        }
    }
} 

您能否在本地添加和 运行 其他输入和输出绑定,例如:

using System;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host;

namespace FunctionApp1
{
    public static class Function1
    {
        [FunctionName("QueueTriggerCSharp")]        
        public static async Task Run([QueueTrigger("myqueue-items", Connection = "QueueStorage")]string myQueueItem, CloudTable inputTable, IAsyncCollector<string> outputEventHubMessages, TraceWriter log)
        {
            log.Info($"C# Queue trigger function processed: {myQueueItem}");

            TableQuery<TableEntity> query = new TableQuery<FailedEventEntity>().Where(
            TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, "helloWorld"));

            List<TableEntity> entities = inputTable.ExecuteQuery(query).ToList();

            await outputEventHubMessages.AddAsync(myQueueItem);

        }
    }
} 

是否需要在 local.settings.json 中进行配置?

当然是。你也需要用属性来装饰它们:

[Table("table-name")] CloudTable inputTable, 
[EventHub("event-hub-name")] IAsyncCollector<string> outputEventHubMessages

本地环境的配置值确实取自 local.settings.json,因此您需要将它们添加到那里(连接字符串等)。

任何正在查找有关函数绑定属性的信息的人:

https://docs.microsoft.com/en-us/azure/azure-functions/functions-dotnet-class-library

以及我的问题的完整示例:

Function1.cs

using System;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host;
using Microsoft.Azure.WebJobs.ServiceBus; // INCLUDE THIS FOR EVENT HUB ATTRIBUTE

namespace FunctionApp1
{
    public static class Function1
    {
        [FunctionName("QueueTriggerCSharp")]        
        public static async Task Run([QueueTrigger("myqueue-items", Connection = "QueueStorageConnectionString")]string myQueueItem, [Table("tableName", Connection = "StorageAccountConnectionString")]CloudTable inputTable, [EventHub("eventHubName", Connection = "EventHubConnectionString")]IAsyncCollector<string> outputEventHubMessages, TraceWriter log)
        {
            log.Info($"C# Queue trigger function processed: {myQueueItem}");

            TableQuery<TableEntity> query = new TableQuery<FailedEventEntity>().Where(
            TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, "helloWorld"));

            List<TableEntity> entities = inputTable.ExecuteQuery(query).ToList();

            await outputEventHubMessages.AddAsync(myQueueItem);

        }
    }
} 

local.settings.json

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "your_storage_account_connection_string",
    "AzureWebJobsDashboard": "your_storage_account_connection_string",
    "QueueStorageConnectionString": "your_queue_storage_connection_string"
    "StorageAccountConnectionString": "your_storage_account_connection_string"
    "EventHubConnectionString": "your_event_hub_connection_string"
  }
}

@Chris:这很奇怪,EventHubAttribute 的 "my" 版本没有连接 属性。我正在使用 Microsoft.Azure.WebJobs.ServiceBus 2.0.0。 您使用的是什么版本?据我所知,最新的可用版本是 2.0.0.