【发布时间】:2019-10-01 11:20:41
【问题描述】:
我正在尝试在 MVC 服务器端和 WinForms 客户端之间创建简单的 SignalR 集线器。
我创建了 NotificationHub 类,指定如下:
using System.Threading.Tasks;
using Microsoft.AspNet.SignalR;
namespace PF.Timesheet.Service
{
public class NotificationHub : Hub
{
public void Send(string name, string message)
{
Clients.All.broadcastMessage(name, message);
}
public override Task OnConnected()
{
return base.OnConnected();
}
}
}
而客户端的代码是这样的:
var hubConnection = new HubConnection("http://localhost:30341/singalr");
var chat = hubConnection.CreateHubProxy("NotificationHub");
string message2 = string.Empty;
chat.On<string, string>("broadcastMessage", (name, message) => { message2 = message; });
chat.On<string, string>("broadcastMessage", (name, message) =>
this.Invoke((Action)(() =>
RichTextBoxConsole.AppendText(String.Format("{0}: {1}" + Environment.NewLine, name, message)));
hubConnection.Start().Wait();
我试图以任何可能的方式从广播消息中获取消息,无论是通过将其分配给某个字符串变量“message2”还是通过将文本附加到 UI 上的富文本框控件。
如果我这样打电话:
hubConnection.Start().Wait();
我将从信号器自托管的 localhost 收到 401 Unauthorized 响应。 (本地主机与客户端 WinForms 应用程序在同一项目中作为不同的解决方案并行运行)。
我在服务器端尝试做的是将消息从这样的代码推送到集线器:
var context = GlobalHost.ConnectionManager.GetHubContext<NotificationHub>();
context.Clients.All.broadcastMessage("NAM", "New entry created.");
如果我从 hubConnection.Start(); 中删除 Wait(),我不会收到 Unauthorized 401 错误,但也不会收到消息值。
有人看到我在这里做错了吗?
到目前为止我尝试过的事情:
- 尝试将
EnableDetailedErrors和EnableJSONP属性设置为true。我在某处读到 SignalR 集线器默认具有[Authorized]属性,并且此配置应该有所帮助。
public class Startup
{
public void Configuration(IAppBuilder app)
{
HttpConfiguration config = new HttpConfiguration();
WebApiConfig.Register(config);
DependencyConfig.Initialize(config);
Loging.Initialize();
app.UseWebApi(config);
app.MapSignalR(new HubConfiguration
{
EnableDetailedErrors = true,
EnableJSONP = true
});
}
}
- 尝试将服务器项目的
WindowsAuth和AnonymousAuth属性设置为Enabled。
-
使用时检查消息是否实际推送到集线器:
context.Clients.All.broadcastMessage("NAM", "New entry created.");
消息在那里。
是否有人通过未经授权的问题并能够从 MVC Server SignalR 集线器读取消息到 WinForms 客户端?
【问题讨论】:
-
可能不相关,但集线器 uri 中似乎有错字
-
@LennartStoop 感谢您的回答。你指的是哪个错别字?也许我错过了像那样愚蠢的东西。
-
我指的是客户端的uri:不应该是
signalr而不是singalr吗? -
@LennartStoop 修复了那个,但问题仍然存在。 :(
-
如果您在没有
.Wait()的情况下运行,您不会得到异常的原因是hubConnection.Start()返回一个Task,要么需要awaited,要么是.Wait()ed,或者它永远不会运行。因此,当您忽略它时,它不会尝试连接(而且您也不会收到广播消息)。
标签: c# asp.net-mvc winforms signalr