.NET 8隔离模式下Azure Function的SignalRTrigger无法正常工作
我之前踩过这个坑,给你分享几个排查和解决的关键点,应该能帮你搞定这个问题:
先检查依赖包是否正确
隔离模式下的SignalR扩展包和普通In-Process模式不一样,你得用专门适配Worker模式的包,别搞错成老的WebJobs版本了。打开你的.csproj文件,确认引用的是Microsoft.Azure.Functions.Worker.Extensions.SignalRService,版本建议用1.1.0及以上,同时确保Microsoft.Azure.Functions.Worker和Microsoft.Azure.Functions.Worker.Sdk的版本也是适配.NET 8的稳定版,比如:<PackageReference Include="Microsoft.Azure.Functions.Worker.Extensions.SignalRService" Version="1.1.0" /> <PackageReference Include="Microsoft.Azure.Functions.Worker.Sdk" Version="1.16.4" /> <PackageReference Include="Microsoft.Azure.Functions.Worker" Version="1.20.1" />确认Program.cs里的服务注册没漏
隔离模式下所有服务都要在Program.cs里注册,SignalR的服务绝对不能忘加,否则触发的时候就会报配置错误。比如你的Program.cs应该是这样的:var host = new HostBuilder() .ConfigureFunctionsWorkerDefaults() .AddSignalR() // 这一步是核心,少了它SignalRTrigger根本起不来 .Build(); host.Run();检查SignalRTrigger函数的绑定写法
隔离模式下的函数绑定参数写法要规范,比如hub名称、事件名称要和客户端发送的完全匹配,举个正确的示例:[Function("ReceiveSignalRMessage")] public async Task ProcessMessage( [SignalRTrigger("chatHub", "messages", "sendMessage", parameterNames: new[] { "username", "content" })] SignalRInvocationContext context, string username, string content, ILogger logger) { logger.LogInformation("收到来自{User}的消息:{Msg}", username, content); // 这里写你的业务逻辑 }注意
chatHub要和你negotiate接口返回的hub名称一致,sendMessage是客户端发送消息时用的事件名,别写错。核对连接字符串配置
不管是本地调试的local.settings.json还是Azure门户里的应用设置,都要确保AzureSignalRConnectionString这个配置项的内容是正确的,要和你的Azure SignalR服务实例的连接字符串完全一致,local.settings.json的示例:{ "IsEncrypted": false, "Values": { "AzureWebJobsStorage": "UseDevelopmentStorage=true", "FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated", "AzureSignalRConnectionString": "Endpoint=你的SignalR服务地址;AccessKey=你的密钥;Version=1.0;" } }别用老的Startup类
如果你项目里还有之前In-Process模式用的Startup类,赶紧删掉!隔离模式下是用Program.cs做服务配置的,老的Startup类会和新的配置冲突,导致服务初始化失败。
内容来源于stack exchange

