Windows下Net6控制台项目SignalR自托管WebApp.Start抛空引用异常
Net6.0下SignalR SelfHost启动NullReferenceException的解决办法
在Net6.0控制台项目中使用Microsoft.AspNet.SignalR.SelfHost调用WebApp.Start("http://localhost:8080")时抛出NullReferenceException,提示未将对象引用设置到对象的实例,核心原因是OWIN启动逻辑与Net6.0的宿主模型不兼容,加上代码本身存在几处疏漏,以下是具体解决步骤:
一、修正项目依赖
确保安装以下NuGet包:
Microsoft.AspNet.SignalR.SelfHostMicrosoft.Owin.Host.HttpListenerMicrosoft.Owin.Cors(若需跨域支持)
二、修复代码逻辑
替换原代码为以下版本,解决初始化空引用及其他疏漏问题:
using Microsoft.Owin; using Owin; using Microsoft.AspNet.SignalR; using Microsoft.Owin.Hosting; [assembly: OwinStartup(typeof(Server.Startup))] namespace Server { public class Startup { public void Configuration(IAppBuilder app) { // 若需跨域则启用该行,否则可注释 app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll); app.MapSignalR(); } } // 必须定义对应的Hub类,原代码中缺失该类 public class test : Hub { // 示例Hub方法,可根据业务需求修改 public void SendMessage(string message) { Clients.All.ReceiveMessage(message); } } internal class Program { static void Main(string[] args) { string url = "http://localhost:8080"; // 显式指定Startup类型,避免OWIN自动扫描初始化失败 using (WebApp.Start<Startup>(url)) { Console.WriteLine("started: " + url); var hubContext = GlobalHost.ConnectionManager.GetHubContext<test>(); // 可选:测试向客户端发送启动通知 hubContext.Clients.All.ReceiveMessage("服务已启动"); } Console.ReadLine(); } } }
三、关键修正点说明
- 显式指定Startup类型:在
WebApp.Start中传入<Startup>泛型参数,确保OWIN正确加载启动配置,避免自动扫描时的空引用问题 - 补充缺失的Hub类:原代码中未定义
testHub类,会导致后续GetHubContext调用失败 - 修复未定义变量:补充
url变量定义,使用using语句管理宿主资源,确保服务停止时正确释放 - 跨域配置:若需要支持跨域客户端连接,启用
app.UseCors并安装对应NuGet包
内容的提问来源于stack exchange,提问作者elllkere
相关产品推荐
相关产品推荐

