Azure Function无法向Service Bus队列写入消息如何解决
问题根因说明
.NET类库模式的Azure Function不需要依赖Extension Bundles,直接通过NuGet安装扩展包即可,你目前的认知是正确的。你遇到的队列无消息、function.json无输出绑定的问题,核心是编译生成function.json时没有识别到返回值的Service Bus输出绑定属性。
解决方案按优先级排序
运行时版本匹配校验
你安装的Microsoft.Azure.WebJobs.Extensions.ServiceBus 4.3.0仅适配Azure Function V3运行时,需确认Azure上部署的函数应用运行时版本为V3,版本不匹配会导致绑定属性无法被识别,生成function.json时直接遗漏输出绑定。绑定写法调整
返回值绑定容易出现属性识别失败的问题,建议改用参数绑定的写法,代码示例如下:
[FunctionName("Message")] public static async Task<IActionResult> Run( [HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = null)] HttpRequest req, [ServiceBus("namequeue", Connection = "AzureWebJobsServiceBus")] IAsyncCollector<string> outputQueue, ILogger log) { log.LogInformation("C# HTTP trigger function processed a request."); string requestBody = await new StreamReader(req.Body).ReadToEndAsync(); dynamic data = JsonConvert.DeserializeObject(requestBody); string name = data?.name ?? "DefaultName"; await outputQueue.AddAsync(name); return new OkResult(); }
调整后重新编译,检查本地bin目录下生成的function.json是否已经包含Service Bus输出绑定,确认后再重新部署即可。
- 手动修改function.json(临时验证用)
如果需要临时在门户验证效果,可以在现有function.json的bindings数组中添加如下输出绑定配置:
{ "type": "serviceBus", "direction": "out", "name": "$return", "queueName": "namequeue", "connection": "AzureWebJobsServiceBus" }
注意:.NET类库模式每次部署都会自动覆盖门户中的function.json,该方法仅适合临时验证,不建议作为最终解决方案
本地运行超时问题修复
本地超时大概率是企业防火墙拦截了Service Bus默认AMQP协议的5671端口,你可以在Service Bus连接字符串末尾添加;TransportType=AmqpWebSockets,改用HTTPS协议传输,绕开端口限制。
内容的提问来源于stack exchange,提问作者andomeda
相关产品推荐
相关产品推荐

