如何调用带SignalR绑定无HTTP绑定的Azure Functions函数
报错原因
你当前直接调用[FunctionName]标记的方法时,Azure Functions运行时不会介入参数注入流程,只有函数被运行时触发(比如HTTP触发、队列触发等)时,才会自动填充SignalR特性绑定的IAsyncCollector<SignalRGroupAction>参数,普通C#方法调用需要手动传入所有实参,所以才会报缺失参数的构建错误。
可行解决方案
方案1:拆分业务逻辑与函数入口(最推荐)
[FunctionName]仅用来标记运行时可识别的函数入口,将SignalR操作逻辑抽为普通工具方法,在实际的触发函数(如HTTP触发函数)中拿到注入的绑定参数后,传入该方法调用即可,示例代码如下:
// 抽离的普通业务逻辑方法,不需要加FunctionName特性 public static Task AddToGroupAsync(IAsyncCollector<SignalRGroupAction> signalRGroupActions, string userId, string groupId) { return signalRGroupActions.AddAsync( new SignalRGroupAction { UserId = userId, GroupName = groupId, Action = GroupAction.Add }); } // 实际的HTTP触发入口,由运行时注入绑定参数 [FunctionName("HttpTrigger_AddToGroup")] public static async Task<IActionResult> HttpAddToGroup( [HttpTrigger(AuthorizationLevel.Function, "post")] HttpRequest req, [SignalR(HubName ="match")]IAsyncCollector<SignalRGroupAction> signalRGroupActions) { string userId = req.Query["userId"]; string groupId = req.Query["groupId"]; // 手动传入注入好的collector调用业务方法 await AddToGroupAsync(signalRGroupActions, userId, groupId); return new OkResult(); }
方案2:通过运行时调用器调用标记了FunctionName的方法
如果确实需要保留该方法作为独立的Function入口,可注入IWebJobsInvoker服务,由它来调用函数,运行时会自动完成参数注入:
- 给
AddToGroup函数添加[NoAutomaticTrigger]特性,标记为无自动触发的函数:
[FunctionName("AddToGroup")] [NoAutomaticTrigger] public static Task AddToGroup( [SignalR(HubName ="match")]IAsyncCollector<SignalRGroupAction> signalRGroupActions, string userId, string groupId) { return signalRGroupActions.AddAsync( new SignalRGroupAction { UserId = userId, GroupName = groupId, Action = GroupAction.Add }); }
- 在触发函数中注入调用器执行目标函数:
[FunctionName("HttpTrigger_CallAddToGroup")] public static async Task<IActionResult> CallAddToGroup( [HttpTrigger(AuthorizationLevel.Function, "post")] HttpRequest req, IWebJobsInvoker invoker) { string userId = req.Query["userId"]; string groupId = req.Query["groupId"]; // 由运行时调用器执行AddToGroup函数,自动注入绑定参数 await invoker.InvokeAsync("AddToGroup", new { userId = userId, groupId = groupId }); return new OkResult(); }
注:如果使用的是隔离进程模型的Azure Functions,调用器对应的服务为IFunctionExecutor。
内容的提问来源于stack exchange,提问作者khan
相关产品推荐
相关产品推荐

