【问题标题】:SignalR: The 'SendCoreAsync' method cannot be called if the connection is not activeSignalR:如果连接不活动,则无法调用“SendCoreAsync”方法
【发布时间】:2021-05-22 16:30:52
【问题描述】:

我正在开发一个 ASP.NET Core Web 应用程序,在该应用程序中,用户通过客户端 (OrderClient) 将能够使用 SignalR 集线器 (OrderHub) 发送和接收消息。我是剃刀页面的新手,所以我可能遗漏了一些明显的东西。

为简单起见,OrderHub 中的 UserConnected 方法如下所示:

    public async Task UserConnected(string someString)
    {
        log.Info(someString);
    }

我的index.cshtml.cs 看起来像这样:

public class IndexModel : PageModel
{
    private readonly ILogger<IndexModel> _logger;
    private HubConnection _hubConnection;

    [BindProperty]
    public string Test { get; set; }

    public IndexModel(ILogger<IndexModel> logger)
    {
        _logger = logger;
        _hubConnection = new HubConnectionBuilder().WithUrl("https://localhost:44336/orderhub").WithAutomaticReconnect().Build();
    }

    public async void OnGet()
    {
        await _hubConnection.StartAsync();
    }

    public async Task<IActionResult> OnPostAsync()
    {
        if (!ModelState.IsValid)
        {
            return Page();
        }
        //await _hubConnection.StartAsync();

        await _hubConnection.SendAsync("UserConnected", Test);

        return RedirectToPage("./Index");
    }
}

而我的index.cshtml 看起来像这样:

@page
@model IndexModel
@{
    ViewData["Title"] = "Home page";
}

<form method="post">
    Name:
    <input asp-for="Test" />
    <input type="submit" />
</form>

我已经尝试在 OrderHub 中进行调试,并且在调用 IndexModel 构造函数和 OnGet() 方法时正确建立了连接。但是,当我单击页面上的按钮时,连接已丢失,并且显示错误“InvalidOperationException:如果连接不活跃,则无法调用'SendCoreAsync'方法”。集线器的状态,在调试时,也显示为“断开连接”。我假设我错误地处理了集线器的生命周期,但是我看不到如何修复它。

如果我每次都重新创建连接,则代码可以正常工作,并且集线器会正确接收来自输入字段的文本。但是,由于每次不重新连接时连接都会关闭,我认为集线器将无法向客户端发送信息,这是我预见到的问题。这也可能是错误的,客户端能够接收消息 - 我还没有尝试过。

【问题讨论】:

    标签: c# asp.net .net-core razor signalr


    【解决方案1】:

    您的 IndexModel 在服务器上是临时的(每个 HTTP 请求的新实例),因此服务器上的新 SignalR 客户端在发布请求期间未连接。

    不要使用表单回发,而是将 SignalR JavaScript 客户端持久保存在浏览器中,并通过 JavaScript 在此处调用集线器方法。见https://docs.microsoft.com/aspnet/core/signalr/javascript-client

    【讨论】:

      猜你喜欢
      • 2017-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-09
      • 1970-01-01
      • 1970-01-01
      • 2014-03-31
      • 2012-03-06
      相关资源
      最近更新 更多