【问题标题】:C# Azure Functions: Can't use CloudQueue type as output bindingC# Azure Functions:不能使用 CloudQueue 类型作为输出绑定
【发布时间】:2023-03-12 12:07:01
【问题描述】:

我正在创建一个通用的WebHook 触发函数。我正在尝试将输出绑定添加到 Azure 队列存储。从文档中,我看到此输出支持 CloudQueue 类型。但是当我在门户中运行以下代码时:

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log, CloudQueue outputQueueItem)
{
    log.Info("C# HTTP trigger function processed a request.");
}

它返回一个错误:

错误 CS0246:找不到类型或命名空间名称“CloudQueue”(您是否缺少 using 指令或程序集引用?)

当我使用以下代码运行从 Visual Studio 发布的新 webhook 函数时:

namespace My.Azure.FunctionApp
{
    public static class SurveyWebHook
    {
        [FunctionName("SurveyWebHook")]
        public static async Task<object> Run([HttpTrigger(WebHookType = "genericJson")]HttpRequestMessage req,
           CloudQueue outputQueueItem, TraceWriter log)
        {
            log.Info($"Survey received");

            return req.CreateResponse(HttpStatusCode.OK, new
            {
                message = $"Survey received"
            });
        }
    }
}

它返回一个错误:

“无法从 Azure WebJobs SDK 调用‘SurveyWebHook’。是否缺少 Azure WebJobs SDK 属性?”

如何将CloudQueue 类型变量作为输出绑定添加到我的WebHook 函数?

更新: 当我使用IBinder 时输入:

namespace My.Azure.FunctionApp
{
    public static class SurveyWebHook
    {
        [FunctionName("SurveyWebHook")]
        public static async Task<object> Run([HttpTrigger(WebHookType = "genericJson")]HttpRequestMessage req, IBinder binder, TraceWriter log)
        {
            log.Info($"Survey received");
            string jsonContent = await req.Content.ReadAsStringAsync();
            CloudQueue outputQueue = await binder.BindAsync<CloudQueue>(new QueueAttribute("surveys"));
            await outputQueue.AddMessageAsync(new CloudQueueMessage("Test Message"));

            return req.CreateResponse(HttpStatusCode.OK, new
            {
                message = $"Survey received"
            });
        }
    }
}

它不会返回错误。但它也不会将消息放入队列。 当我使用[Queue("myqueue")] CloudQueue 时也会发生同样的情况。 它仅在我使用IAsyncCollector&lt;T&gt;时有效

更新: 最后,我明白了为什么我没有在队列中看到消息。 当我从 Visual Studio 发布 Azure Functions 项目时,它会将 "configurationSource": "attributes" 参数添加到 function.json。这将覆盖我在输出绑定中的 connection 参数,以绑定到我的 Function App 服务的默认存储帐户。我的队列是在这个默认存储帐户中创建的。我删除了configurationSource 参数,我的函数开始按预期工作。

【问题讨论】:

  • 您的活页夹示例对我来说很好用

标签: c# azure azure-functions


【解决方案1】:

要使您的第一个示例正常工作,请修复参考 - 在顶部添加以下行:

#r "Microsoft.WindowsAzure.Storage"

using Microsoft.WindowsAzure.Storage.Queue;

要使您的第二个示例正常工作,请将CloudQueue 参数标记为QueueAttribute

[FunctionName("SurveyWebHook")]
public static async Task<object> Run(
    [HttpTrigger(WebHookType = "genericJson")] HttpRequestMessage req,
    [Queue("myqueue")] CloudQueue outputQueueItem, 
    TraceWriter log)

【讨论】:

  • 第一个例子仍然不起作用(同样的错误)。也许我应该在 project.json 中添加一个依赖项。第二个示例不返回错误,但消息未添加到队列中。当我使用 IBinder 类型时也是如此。仅当我使用 IAsyncCollector 时才有效
  • @Dmitry 1 - project.json 不需要,应该按原样工作。 2 - 然后显示您的代码,outputQueueItem.AddMessage(new CloudQueueMessage("test")) 工作正常。
  • @Dmitry 来吧,你还没有using
  • 是的。对不起我的疏忽。现在可以了。谢谢。但是我的 VS 代码仍然存在奇怪的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-06
  • 1970-01-01
  • 2018-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多