使用 IBinder 预编译 Azure Function 失败并出现 "No binding found for attribute" 异常
Pre-compiled Azure Function with IBinder fails with "No binding found for attribute" exception
我有一个通过 IBinder 访问通知中心的 Azure 函数,如下所示:-
public static async Task Run(string msg, IBinder binder, TraceWriter log)
{
var genericInputMessage = JsonConvert.DeserializeObject<GenericInputMessage>(msg);
string devicetag = "deviceid:" + genericInputMessage.device;
var attribute = new NotificationHubAttribute
{
ConnectionStringSetting = "NotificationHubConnection",
HubName = "NotificationHubName",
TagExpression = devicetag
};
IAsyncCollector<Notification> notifications = binder.Bind<IAsyncCollector<Notification>>(attribute);
...
...
}
当通过 Azure 门户完成时,编译和工作正常。
当我使用 VS2017(版本 15.3.3)在预编译的 Azure 函数中使用相同的代码,并在本地 运行 时,我在调用 binder.Bind 时遇到异常.
给出的例外是....
[23/09/2017 16:47:07] A ScriptHost error has occurred
[23/09/2017 16:47:07] Exception while executing function: DataProcessor. Microsoft.Azure.WebJobs.Host: No binding found for attribute 'Microsoft.Azure.WebJobs.NotificationHubAttribute'.
我预编译的Azure函数代码如下:-
public static async Task Run([EventHubTrigger("EventHubName", Connection = "EventHubConnection")]string msg, IBinder binder, TraceWriter log)
{
var genericInputMessage = JsonConvert.DeserializeObject<GenericInputMessage>(msg);
string devicetag = "deviceid:" + genericInputMessage.device;
var attribute = new NotificationHubAttribute
{
ConnectionStringSetting = "NotificationHubConnection",
HubName = "NotificationHubName",
TagExpression = devicetag
};
IAsyncCollector<Notification> notifications = binder.Bind<IAsyncCollector<Notification>>(attribute);
...
...
}
我正在使用以下 NuGet 包:-
有什么可能导致这种情况的想法吗?
这最终可能是由于运行时未正确检测到通知中心的使用情况(因此未加载扩展)。通常,我们可以扫描 Function.json 来确定需要什么——但 IBinder 的使用更加不透明。
作为解决方法,您可以添加引用通知中心绑定的函数吗?它可以是手动触发器,不需要实际调用。
这与 https://github.com/Azure/azure-webjobs-sdk-script/issues/1637
有关
我有一个通过 IBinder 访问通知中心的 Azure 函数,如下所示:-
public static async Task Run(string msg, IBinder binder, TraceWriter log)
{
var genericInputMessage = JsonConvert.DeserializeObject<GenericInputMessage>(msg);
string devicetag = "deviceid:" + genericInputMessage.device;
var attribute = new NotificationHubAttribute
{
ConnectionStringSetting = "NotificationHubConnection",
HubName = "NotificationHubName",
TagExpression = devicetag
};
IAsyncCollector<Notification> notifications = binder.Bind<IAsyncCollector<Notification>>(attribute);
...
...
}
当通过 Azure 门户完成时,编译和工作正常。
当我使用 VS2017(版本 15.3.3)在预编译的 Azure 函数中使用相同的代码,并在本地 运行 时,我在调用 binder.Bind 时遇到异常.
给出的例外是....
[23/09/2017 16:47:07] A ScriptHost error has occurred
[23/09/2017 16:47:07] Exception while executing function: DataProcessor. Microsoft.Azure.WebJobs.Host: No binding found for attribute 'Microsoft.Azure.WebJobs.NotificationHubAttribute'.
我预编译的Azure函数代码如下:-
public static async Task Run([EventHubTrigger("EventHubName", Connection = "EventHubConnection")]string msg, IBinder binder, TraceWriter log)
{
var genericInputMessage = JsonConvert.DeserializeObject<GenericInputMessage>(msg);
string devicetag = "deviceid:" + genericInputMessage.device;
var attribute = new NotificationHubAttribute
{
ConnectionStringSetting = "NotificationHubConnection",
HubName = "NotificationHubName",
TagExpression = devicetag
};
IAsyncCollector<Notification> notifications = binder.Bind<IAsyncCollector<Notification>>(attribute);
...
...
}
我正在使用以下 NuGet 包:-
有什么可能导致这种情况的想法吗?
这最终可能是由于运行时未正确检测到通知中心的使用情况(因此未加载扩展)。通常,我们可以扫描 Function.json 来确定需要什么——但 IBinder 的使用更加不透明。
作为解决方法,您可以添加引用通知中心绑定的函数吗?它可以是手动触发器,不需要实际调用。
这与 https://github.com/Azure/azure-webjobs-sdk-script/issues/1637
有关