【发布时间】: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