具有输出绑定到队列的 Http 触发器功能

Http trigger function with output binding to queue

我在 .Net5 中有一个 http 触发函数,独立函数。

我很难让输出绑定为此 https 函数工作。

https 函数检索对象列表。这些对象需要作为单独的消息添加到队列中。

[FunctionName("TestQueueOutput")]
[return: Queue("myqueue-items", Connection = "AzureWebJobsStorage")]    
public async Task<HttpResponseData> RunAsync([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestData req,          
            FunctionContext context)
{
    HttpResponseData okResponse = null; 
    okResponse = req.CreateResponse(System.Net.HttpStatusCode.OK);     

    // List of Objects
    var _list= await _repo.Get();
    await okResponse.WriteAsJsonAsync(_list);
    return okResponse;       
}

当我运行函数时,http响应可以看到列表,但在Azure中定义的队列中什么也看不到。

我进一步按照以下文章将输出绑定添加到 Http 触发器。

https://docs.microsoft.com/en-us/azure/azure-functions/functions-add-output-binding-storage-queue-vs?tabs=in-process

当我为隔离进程添加多响应 class 时,QueueOutput 的输出绑定,该函数为其提供红色波浪线。找不到正确的 nugget 包来修复它。

我花了无数个小时将列表项作为消息添加到队列中。

我做的对吗?任何指导将不胜感激

更新 #1:当我添加 MultiResponse class 时,我不知道如何解决 QueueOutput 问题如下图所示:

有几件事你需要看一下。首先,您希望 return HttpResponseData,但也有 return 绑定设置。而且,正如 HttpResponseData 所期望的那样,您正在 returning HttpResponse。但是 returns 绑定试图将其转换为队列消息。而且消息信息好像是写到response body里了,不是应该的样子

根据您链接的文章,尝试以下操作:

  1. 将 class 添加到您的项目中,将其命名为 MultiRepsonse
  2. 实施 MultiResponse class 如下所示
  3. 在您的函数中使用 MultiResponse class,如下所示

这实现了 MultiResponse,告诉 Function 使用它并使您能够 return a HttpResonse 同时将消息写入队列。当心:下面是浏览器编写的未经验证的代码。

MultiRespsonse.cs

public class MultiResponse
{
    [QueueOutput("myqueue-items",Connection = "AzureWebJobsStorage")]
    public string[] Messages { get; set; }

    public HttpResponseData HttpResponse { get; set; }
}

TestQueueOutput.cs

[FunctionName("TestQueueOutput")]
public async Task<MultiResponse> RunAsync(
    [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestData req,
    FunctionContext context)
{
    var response = new MultiResponse();
    response.HttpResponse = req.CreateResponse(HttpStatusCode.OK);

    var _list = await _repo.Get();
    response.Messages = new string[_list.Count];
    foreach (var item in _list)
    {
        // Add the item to the list
    }

    return response;       
}