2017-10-18 109 views
1

我正在使用Azure函数,尝试使用输出队列来处理事情,但我一直运行时出现输出绑定错误。我想知道这是否与我装饰参数的方式有关?我已经看到如何使用单个队列作为返回值,但我需要有多个输出队列。Azure函数中的错误绑定字符串输出队列

函数定义:

using Microsoft.Azure.WebJobs; using Microsoft.Azure.WebJobs.Host; using Newtonsoft.Json; using Newtonsoft.Json.Linq; 

namespace FunctionApp1 { 
    public static class TestItemAddQueueTrigger 
    { 
     [StorageAccount("AzureWebJobsStorage")] 
     [FunctionName("TestItemAddQueueTrigger")] 
     public static void Run([QueueTrigger("testitem-add")] string itemAdd, 
      TraceWriter log, 
      [Queue("testitem-added", Connection = "AzureWebJobsStorage")] out string itemAddedQueue) 
     { 
      dynamic message = JObject.Parse(itemAdd); 

      log.Info($"Received message\n{JsonConvert.SerializeObject(message, Formatting.Indented)}"); 


      var itemAddedQueueMessage = new 
      { 
      }; 

      itemAddedQueue = JsonConvert.SerializeObject(itemAddedQueueMessage); 

      log.Info($"Sent message to queue \"itemAddedQueue\"\n{JsonConvert.SerializeObject(itemAddedQueueMessage, Formatting.Indented)}"); 
     } 
    } } 

错误消息:

A ScriptHost error has occurred 
[10/18/2017 4:31:27 PM] Microsoft.Azure.WebJobs.Host: Error indexing method 'Functions.TestItemAddQueueTrigger'. Microsoft.Azure.WebJobs.Host: Cannot bind parameter 'itemAddedQueue' to type String&. Make sure the parameter Type is supported by the binding. If you're using binding extensions (e.g. ServiceBus, Timers, etc.) make sure you've called the registration method for the extension(s) in your startup code (e.g. config.UseServiceBus(), config.UseTimers(), etc.). 

的NuGet出处:

Microsoft.NET.Sdk.Functions(1.0.6)Microsoft.Azure.WebJobs (2.1.0-beta4)Microsoft.Azure.WebJobs.Extensions(2.1.0-beta4)
Microsoft.Azure.WebJobs.Extensions.Http(1.0.0-BETA4)Newtonsoft.Json (9.0.1)System.ValueTuple(4.3.0)

项目文件:

<Project Sdk="Microsoft.NET.Sdk"> 
    <PropertyGroup> 
    <TargetFramework>net47</TargetFramework> 
    </PropertyGroup> 
    <ItemGroup>  
    <PackageReference Include="Microsoft.NET.Sdk.Functions" Version="1.0.6" /> 
    </ItemGroup> 
    <ItemGroup> 
    <Reference Include="Microsoft.CSharp" /> 
    </ItemGroup> 
    <ItemGroup> 
    <None Update="host.json"> 
     <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> 
    </None> 
    <None Update="local.settings.json"> 
     <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> 
     <CopyToPublishDirectory>Never</CopyToPublishDirectory> 
    </None> 
    </ItemGroup> 
</Project> 

解决方案文件:

Microsoft Visual Studio Solution File, Format Version 12.00 
# Visual Studio 15 
VisualStudioVersion = 15.0.27004.2002 
MinimumVisualStudioVersion = 10.0.40219.1 
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FunctionApp1", "FunctionApp1\FunctionApp1.csproj", "{10F86A7D-5E03-41A9-8BBB-103C8E06E059}" 
EndProject 
Global 
    GlobalSection(SolutionConfigurationPlatforms) = preSolution 
     Debug|Any CPU = Debug|Any CPU 
     Release|Any CPU = Release|Any CPU 
    EndGlobalSection 
    GlobalSection(ProjectConfigurationPlatforms) = postSolution 
     {10F86A7D-5E03-41A9-8BBB-103C8E06E059}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 
     {10F86A7D-5E03-41A9-8BBB-103C8E06E059}.Debug|Any CPU.Build.0 = Debug|Any CPU 
     {10F86A7D-5E03-41A9-8BBB-103C8E06E059}.Release|Any CPU.ActiveCfg = Release|Any CPU 
     {10F86A7D-5E03-41A9-8BBB-103C8E06E059}.Release|Any CPU.Build.0 = Release|Any CPU 
    EndGlobalSection 
    GlobalSection(SolutionProperties) = preSolution 
     HideSolutionNode = FALSE 
    EndGlobalSection 
    GlobalSection(ExtensibilityGlobals) = postSolution 
     SolutionGuid = {B0A27606-232E-4B58-9586-12AB68E9CAC0} 
    EndGlobalSection 
EndGlobal 
+0

尝试从'string'之前删除'out':'[Queue(“testitem-added”,Connection =“AzureWebJobsStorage”)] string itemAddedQueue' –

+1

您的代码对我来说工作得很好。你参考哪个NuGet包? – Mikhail

+0

@AndrésNava-.NET - 'out'关键字很重要。这是排队函数('[Queue] out string')和触发队列消息('[QueueTrigger] string')之间的区别 –

回答

2

我能够通过重新安装从NPM蔚蓝的核心工具的1.x到解决此问题:NPM安装-g Azure的功能核心工具

这迫使Visual Studio重新安装Azure Cli工具,我最好的猜测是这是一个版本冲突的地方。

不幸的是,我不知道造成我的问题的根本原因或版本组合。

0

我已经看到它如何可以使用单个队列作为返回值来完成,但我有一个需要有多个输出队列。

我已经使用了与您相同的功能包,并在我身边创建了测试演示。它运作良好。

enter image description here

因此,我建议你可以尝试创建一个新的功能项目,并再次使用下面的代码测试。

此代码有多个输出队列。它会自动发送队列到“输出”和“输出2”。

public static class Function1 
    { 
     [StorageAccount("AzureWebJobsStorage")] 
     [FunctionName("Function1")] 
     public static void Run([QueueTrigger("queue")]string myQueueItem,[Queue("output")] out string test2, [Queue("output2", Connection = "AzureWebJobsStorage")] out string itemAddedQueue, TraceWriter log) 
     { 
      log.Info($"C# Queue trigger function processed: {myQueueItem}"); 

      dynamic message = JObject.Parse(myQueueItem); 

      log.Info($"Received message\n{JsonConvert.SerializeObject(message, Formatting.Indented)}"); 


      var itemAddedQueueMessage = new test 
      { 
       name = "test" 
      }; 

      itemAddedQueue = JsonConvert.SerializeObject(itemAddedQueueMessage); 

      test2 = JsonConvert.SerializeObject(itemAddedQueueMessage); 

      log.Info($"Sent message to queue \"itemAddedQueue\"\n{JsonConvert.SerializeObject(itemAddedQueueMessage, Formatting.Indented)}"); 
     } 

     public class test 
     { 
      public string name { get; set; } 
     } 

    } 

结果如下:

enter image description here

+0

感谢您的反馈,看起来像我需要为多个队列设置。当我运行这段代码时,我仍然遇到同样的错误。 –