You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET 6中SignalR连接Razor页面遇HttpNavigationManager未初始化错误

问题描述

我正尝试使用ASP.NET 6结合Identity和SignalR实现一个简易聊天功能,目前在通过HubConnectionBuilder将Razor页面聊天模块与SignalR Hub进行连接。作为ASP.NET新手,我的程序在执行代码_hubConnection = new HubConnectionBuilder().WithUrl(_navigationManager.ToAbsoluteUri(HUBURL)).Build();时停止运行,抛出“HttpNavigationManager has not been initialized”错误。我不清楚该错误的含义,也不了解HttpNavigationManager的用法,且未找到MSDN上相关的条目,希望能得到相关解决建议。

相关代码(chat.cshtml.cs)
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.AspNetCore.SignalR.Client;
using Microsoft.AspNetCore.SignalR;
using Microsoft.EntityFrameworkCore.Metadata.Internal;
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Routing;
using Microsoft.AspNetCore.Http.Extensions;

namespace LoginServerChat.Pages
{
    public class ChatModel : PageModel
    {
        public const string HUBURL = "/api/ChatSignal";

        private readonly ILogger<ChatModel> _logger;
        private readonly UserManager<IdentityUser> _userManager;
        private readonly NavigationManager _navigationManager;
        private HubConnection _hubConnection;

        public List<SelectListItem> Users { get; set; }
        public string myUser { get; set; }
        public ChatModel(ILogger<ChatModel> logger, UserManager<IdentityUser> userManager, NavigationManager navigationManager)
        {
            _logger = logger;
            _userManager = userManager;
            _navigationManager = navigationManager;
            _hubConnection = new HubConnectionBuilder().WithUrl(_navigationManager.ToAbsoluteUri(HUBURL)).Build();
        }
        public void OnGet()
        {
            Users = _userManager.Users.ToList()
                .Select(user => new SelectListItem { Text = user.UserName, Value = user.UserName})
                .OrderBy(s => s.Text).ToList();

            myUser = User.Identity.Name;
        }
    }
}
解决建议
  • 错误核心原因:NavigationManager是Blazor组件专属的服务,用于处理单页应用的路由导航,而你在Razor Pages的PageModel中注入了它——Razor Pages属于ASP.NET MVC体系,完全不支持这个服务,所以会抛出未初始化的错误。

  • 具体修正步骤:

    1. 移除无效依赖:从ChatModel的构造函数中删除NavigationManager的注入参数,同时删掉代码顶部的using Microsoft.AspNetCore.Components;和using Microsoft.AspNetCore.Components.Routing;这两个无用的引用。
    2. 替换Hub连接地址生成逻辑:
      • 如果你不需要绝对URL,直接用相对路径即可,SignalR客户端会自动适配当前站点的地址:
        _hubConnection = new HubConnectionBuilder().WithUrl(HUBURL).Build();
        
      • 如果必须生成绝对URL,不要在构造函数中创建HubConnection(此时HTTP上下文还未初始化),移到OnGet方法中,利用Request对象生成:
        public void OnGet()
        {
            Users = _userManager.Users.ToList()
                .Select(user => new SelectListItem { Text = user.UserName, Value = user.UserName})
                .OrderBy(s => s.Text).ToList();
        
            myUser = User.Identity.Name;
        
            // 生成SignalR Hub的绝对URL
            var hubAbsoluteUrl = $"{Request.Scheme}://{Request.Host}{HUBURL}";
            _hubConnection = new HubConnectionBuilder().WithUrl(hubAbsoluteUrl).Build();
        }
        
    3. 推荐的最佳实践:SignalR客户端通常运行在浏览器端,更建议在Razor页面的JavaScript代码中初始化连接,而不是在后端的PageModel里。例如在chat.cshtml中添加:
      <!-- 引入SignalR客户端脚本 -->
      <script src="~/lib/signalr/dist/browser/signalr.js"></script>
      <script>
          // 初始化SignalR连接
          const chatConnection = new signalR.HubConnectionBuilder()
              .withUrl("/api/ChatSignal")
              .build();
      
          // 启动连接
          chatConnection.start().catch(err => console.error(err.toString()));
      
          // 后续可以添加接收消息、发送消息的逻辑
      </script>
      

内容的提问来源于stack exchange,提问作者FoxMaccloud

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 02:20:53