WPF SignalR 服务器 returns HTTP 400 错误请求(主机地址无效)
WPF SignalR server returns HTTP 400 Bad Request (Invalid host address)
我正在尝试设置一个 SignalR 中心,以便能够通过 Web 将通知推送到一组 WPF 客户端。我尝试遵循基本指南和教程并创建了一个 WPF SignalR 服务器(仅用于测试目的)。这已经放在我 LAN 中的服务器上,它看起来是这样的:
Startup.cs
class Startup
{
public void Configuration(IAppBuilder app)
{
HubConfiguration hc = new HubConfiguration();
hc.EnableDetailedErrors = true;
app.UseCors(CorsOptions.AllowAll);
app.MapSignalR(hc);
}
}
MainWindow.xaml.cs
public IDisposable SignalR { get; set; }
const string ServerURI = "http://localhost:8554";
private void StartServer()
{
try
{
SignalR = WebApp.Start(ServerURI);
}
catch (TargetInvocationException)
{
WriteToConsole("A server is already running at " + ServerURI);
return;
}
this.Dispatcher.Invoke(() => btnStopHub.IsEnabled = true);
}
AdHocHub.cs
public class AdHocHub : Hub
{
public void Send(string data)
{
Clients.All.notifyData(data);
}
public override Task OnConnected()
{
Application.Current.Dispatcher.Invoke(() =>
((MainWindow)Application.Current.MainWindow).WriteToConsole("Client connected: " + Context.ConnectionId));
return base.OnConnected();
}
public Task OnDisconnected()
{
Application.Current.Dispatcher.Invoke(() =>
((MainWindow)Application.Current.MainWindow).WriteToConsole("Client disconnected: " + Context.ConnectionId));
return base.OnDisconnected(true);
}
}
服务器启动正常。但是,当我尝试将客户端连接到它时,它拒绝给我 400 - Bad Request。如果我尝试导航到 http://192.nnn.nnn.nnn/signalr
,我得到的只是 错误的请求 - 无效的主机名 。如果我 运行 服务器和客户端在同一台机器上一切正常。我在这里做错了什么?
客户端调用是这样设置的:
private async void ConnectAsync()
{
Connection = new HubConnection(ServerURI);
HubProxy = Connection.CreateHubProxy("AdHocHub");
HubProxy.On<string>("notifyData", (notifyData) => this.Dispatcher.Invoke(() => txtEvents.AppendText(notifyData.ToString())));
try
{
await Connection.Start();
}
catch (HttpRequestException ex)
{
MessageBox.Show(ex.ToString());
lblStatus.Content = "Unable to connect to server: Start server before connecting clients.";
return;
}
txtEvents.AppendText("Connected to server and listening...");
}
我试过将服务器中的 URI 从主机名更改为它的 IP,但后来我只得到一个 TargetInvocationException
,所以这无济于事。
如前所述,只要客户端和服务器 运行 在同一台机器上,整个设置似乎就可以正常工作,但即使我设置了 [=17],我也不会移动它=] 到 AllowAll
.
(将我自己的评论转换为答案,因为在大多数情况下它似乎是答案)
将服务器中的 ServerURI
从 localhost
更改为 http://+:8554
,否则它将仅侦听本地主机。它在同一台机器上工作,因为它是本地主机。
但是一旦你将其更改为这个新方案,在调试时,你将需要 visual studio 运行 在管理员模式下,否则如果 UAC 将抛出 TargetInvocationException
在。
我正在尝试设置一个 SignalR 中心,以便能够通过 Web 将通知推送到一组 WPF 客户端。我尝试遵循基本指南和教程并创建了一个 WPF SignalR 服务器(仅用于测试目的)。这已经放在我 LAN 中的服务器上,它看起来是这样的:
Startup.cs
class Startup
{
public void Configuration(IAppBuilder app)
{
HubConfiguration hc = new HubConfiguration();
hc.EnableDetailedErrors = true;
app.UseCors(CorsOptions.AllowAll);
app.MapSignalR(hc);
}
}
MainWindow.xaml.cs
public IDisposable SignalR { get; set; }
const string ServerURI = "http://localhost:8554";
private void StartServer()
{
try
{
SignalR = WebApp.Start(ServerURI);
}
catch (TargetInvocationException)
{
WriteToConsole("A server is already running at " + ServerURI);
return;
}
this.Dispatcher.Invoke(() => btnStopHub.IsEnabled = true);
}
AdHocHub.cs
public class AdHocHub : Hub
{
public void Send(string data)
{
Clients.All.notifyData(data);
}
public override Task OnConnected()
{
Application.Current.Dispatcher.Invoke(() =>
((MainWindow)Application.Current.MainWindow).WriteToConsole("Client connected: " + Context.ConnectionId));
return base.OnConnected();
}
public Task OnDisconnected()
{
Application.Current.Dispatcher.Invoke(() =>
((MainWindow)Application.Current.MainWindow).WriteToConsole("Client disconnected: " + Context.ConnectionId));
return base.OnDisconnected(true);
}
}
服务器启动正常。但是,当我尝试将客户端连接到它时,它拒绝给我 400 - Bad Request。如果我尝试导航到 http://192.nnn.nnn.nnn/signalr
,我得到的只是 错误的请求 - 无效的主机名 。如果我 运行 服务器和客户端在同一台机器上一切正常。我在这里做错了什么?
客户端调用是这样设置的:
private async void ConnectAsync()
{
Connection = new HubConnection(ServerURI);
HubProxy = Connection.CreateHubProxy("AdHocHub");
HubProxy.On<string>("notifyData", (notifyData) => this.Dispatcher.Invoke(() => txtEvents.AppendText(notifyData.ToString())));
try
{
await Connection.Start();
}
catch (HttpRequestException ex)
{
MessageBox.Show(ex.ToString());
lblStatus.Content = "Unable to connect to server: Start server before connecting clients.";
return;
}
txtEvents.AppendText("Connected to server and listening...");
}
我试过将服务器中的 URI 从主机名更改为它的 IP,但后来我只得到一个 TargetInvocationException
,所以这无济于事。
如前所述,只要客户端和服务器 运行 在同一台机器上,整个设置似乎就可以正常工作,但即使我设置了 [=17],我也不会移动它=] 到 AllowAll
.
(将我自己的评论转换为答案,因为在大多数情况下它似乎是答案)
将服务器中的 ServerURI
从 localhost
更改为 http://+:8554
,否则它将仅侦听本地主机。它在同一台机器上工作,因为它是本地主机。
但是一旦你将其更改为这个新方案,在调试时,你将需要 visual studio 运行 在管理员模式下,否则如果 UAC 将抛出 TargetInvocationException
在。