2017-09-01 61 views
0

我遇到Azure服务总线输出绑定问题,我不确定如何继续。我没有找到类似的问题,所以我很抱歉,如果这是重复的。Azure功能服务总线输出绑定错误

我想使用本地VS 2017开发过程,所以应该自动生成的function.json绑定。函数签名如下:

[FunctionName("RequestNewPaladinInvitation")] 
    public static HttpResponseMessage Run(
    [HttpTrigger(AuthorizationLevel.Anonymous, "post")]HttpRequestMessage req, 
    [ServiceBus("thequeue")] ICollector<Invitation> invitationOutputQueue, 
    TraceWriter log) 
    { 
    //Do some stuff and write to the queue 
    invitationOutputQueue.Add(invite); 
    } 

在本地运行函数时出现以下错误。

Microsoft.Azure.WebJobs.Host:错误索引方法 'RequestNewPaladinInvitation.Run'。 Microsoft.Azure.WebJobs.Host: 无法将参数'invitationOutputQueue'绑定到ICollector`1类型。 确保绑定支持参数Type。如果你是 使用绑定扩展(例如ServiceBus,定时器等),确保 你已经调用了 启动代码中的扩展的注册方法(例如config.UseServiceBus(),config.UseTimers )等)。 [2017年9月1日下午5时42分49秒]错误索引方法 'RequestNewPaladinInvitation.Run'

我的两个host.json和local.settings.json定义如下:

{ 
    "IsEncrypted": false, 
    "Values": { 
     "AzureWebJobsStorage": "<MyStorageAccountInfo>", 
     "AzureWebJobsDashboard": "<MyDashboardInfo>", 
     "AzureWebJobsServiceBus": "<MyServiceBusConnectionString>" 
    } 
} 

我深深地感到,定义AzureWebJobsServiceBus值会使整个函数应用程序中的任何ServiceBus绑定的默认ServiceBusAccount成为可能。

我也尝试明确地指出ServiceBus绑定到账户的连接字符串,并使用以下替代属性[ServiceBus("createpaladininvitation",Connection = "ServiceBus")]。我对该惯例的理解是,不应该包含属性的一部分。以防万一我误解了,我也试过[ServiceBus("createpaladininvitation",Connection = "AzureWebJobsServiceBus")]。我甚至尝试用以下属性来装饰方法和参数,[ServiceBusAccount("ServiceBus")]。我也尝试了与ServiceBus属性的Connection参数相同的变体。

在所有情况下,我都得到相同的function.json输出,它显示没有为ServiceBus输出绑定生成绑定。

这里的function.json:

{ 
    "generatedBy": "Microsoft.NET.Sdk.Functions-1.0.0.0", 
    "configurationSource": "attributes", 
    "bindings": [ 
    { 
     "type": "httpTrigger", 
     "methods": [ 
     "post" 
     ], 
     "authLevel": "anonymous", 
     "name": "req" 
    } 
    ], 
    "disabled": false, 
    "scriptFile": "..\\bin\\AzureFunctionsPoc.dll", 
    "entryPoint": "AzureFunctionsPoc.RequestNewPaladinInvitation.Run" 
} 

这感觉就像我失去了一些东西明显。

[更新]

当我试图继续弄清楚是怎么回事,我在本地运行的功能和编辑生成function.json文件,并补充说,我认为应该已产生约束力。由此产生的手动编辑的function.json是:

{ 
    "generatedBy": "Microsoft.NET.Sdk.Functions-1.0.0.0", 
    "configurationSource": "attributes", 
    "bindings": [ 
    { 
     "type": "httpTrigger", 
     "methods": [ 
     "post" 
     ], 
     "authLevel": "anonymous", 
     "name": "req" 
    }, 
    { 
     "type": "serviceBus", 
     "name": "invitationOutputQueue", 
     "queueName": "createpaladininvitation", 
     "connection": "ServiceBus", 
     "direction": "out" 
    } 
    ], 
    "disabled": false, 
    "scriptFile": "..\\bin\\AzureFunctionsPoc.dll", 
    "entryPoint": "AzureFunctionsPoc.RequestNewPaladinInvitation.Run" 
} 

通过这些编辑,该方法的工作原理与预期完全相同。

这种感觉更像是我缺少的语法或约定问题或工具错误。

+0

似乎与[此问题](https://stackoverflow.com/questions/45986719/using-azure-functions-in-vs2017-cannot-bind-to-servicebus-queue-as-an-output ) – Mikhail

+0

@Mikhail - 我快速浏览了你链接的问题。它看起来很相似。但是,与这个问题不同的是,在我的情况下,更改Trigger类型似乎没有任何区别。但是,谢谢你指出。 –

回答

3

关于ServiceBus输出触发器,目前存在一个出色的工具错误。如果你部署“您的应用程序Azure的功能它都可以工作,只是没有本地与工具

请在这里看到相关GitHub的问题:Service Bus output binding issue

这里:Latest v1.0.0 not working with ServiceBus. alpha 6 still works.

这与懒惰的负载。我们没有拿起服务总线扩展,因此索引错误。 (Azure/azure-webjobs-sdk-script#1637)

原因是ServiceBus扩展与其他扩展不同。我们期望扩展有一个实现IExtensionConfigProvider的公共无参数配置对象。

SB是内部的(https://github.com/Azure/azure-webjobs-sdk/blob/663a508e8a851629c26a51e7de3af36629dfd120/src/Microsoft.Azure.WebJobs.ServiceBus/Config/ServiceBusExtensionConfig.cs#L17),所以我们对ExportedTypes的扫描忽略了它(请参阅https://github.com/Azure/azure-webjobs-sdk-script/blob/b1445485807bb190ba0716af1a8dc81a864b5228/src/WebJobs.Script/Host/ScriptHost.cs#L735)。 SB的配置没有无参数ctor,因此Activator.createInstance调用也会失败。 此修补程序(我们为脚本运行时所做的)Azure/azure-webjobs-sdk-script#1804将修复此问题;但这需要拉到CLI。

+0

谢谢!我似乎无法找到合适的回购。 –