【发布时间】:2018-11-12 13:18:09
【问题描述】:
我现在为此苦苦挣扎了一段时间,但我无法让它发挥作用。我有 2 个应用程序,都在带有 Win IoT 的 Raspberry Pi 2 上运行:
ASP.NET Core 2.1 Web Api - 在这个 WebApi 中,我正在运行 SignalR 主机(发布为
win8-armwin10-arm)。通用 Windows 应用 - 此应用将是一个客户端,应与主机和所有其他客户端(作为 ARM 发布)进行通信。
当我将 Web Api 部署到 Raspberry 时,一切正常。我有一个作为客户端的测试控制台应用程序,它可以毫无问题地与 SignalR 主机连接。 当我部署 UWP 应用程序并尝试运行它时,它在 HubConnection 的 hubConn.Start(...) 方法中崩溃,并且返回错误:
HttpClientException:StatusCode:405,ReasonPhrase:'方法不是 允许',版本:1.1,内容:System.Net.Http.StreamContent, 标头:{ 服务器:Kestrel 日期:2018 年 6 月 2 日星期六 17:04:15 GMT
内容长度:0 内容类型:文本/纯文本 }
testconsole 和 UWP 都使用 Microsoft.AspNet.SignalR.Client (2.2.3) nuget 包(这是最新的)。 ASP.NET Core 2.1 Web Api 使用Microsoft.AspNetCore.App SDK (2.1.0)。
通过阅读这篇文章SignalR version compatability (StatusCode: 405 'Method Not Allowed'),我熟悉 SignalR 不能向后兼容两个主机作为客户端的事实。但我希望当我使用 nuget 上可用的最新 nuget 包和版本时,一切都会正常工作。
我也不明白为什么测试控制台实际上能够毫无错误地连接,但 UWP 应用程序甚至没有使用相同的 SignalR 客户端 nuget 包。
另外,我知道 ASP.NET Core 2.1 包和 SignalR 客户端包是 2 个不同的包,但我无法将 nuget 包 Microsoft.AspNetCore.App 添加到 UWP 项目中,因为它与任何 win10-arm 平台都不兼容.
知道如何建立和运行连接吗?
2018 年 6 月 4 日更新问题
我在这个问题中删除了我之前的假设。我认为测试控制台应用程序已成功连接,但事实并非如此。不同之处在于测试控制台尝试同步连接,但这导致了错误的吞噬。我验证了与 SignalR 主机的连接状态,该状态从“正在连接”直接变为“已断开”。
问题仍然存在:如果我想使用 ASP.NET Core 2.1 SignalR,我应该在我的测试控制台应用程序以及我的 UWP 项目中包含哪个 nuget 包?
这里是一些代码;所有项目都是通过 File - New project 完全默认的,加上下面的代码。
ASP.NET Core 2.1 Web API
Startup.cs
public class Startup
{
...
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
...
services.AddMvc();
services.AddSignalR();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
...
app.UseSignalR(route =>
{
route.MapHub<HomeAutomationHost>("/HomeAutomationHost");
});
app.UseMvc();
}
}
通用 Windows 应用程序
MainPage.xaml.cs
public class MainPage
{
...
public async Task DoConnect()
{
var hubConn = new HubConnection("http://192.168.2.49:5000/HomeAutomationHost", false);
hubConn.EnsureReconnecting();
var signalRHost = hubConn.CreateHubProxy("HomeAutomationHost");
await hubConn.Start(new WebSocketTransport());
}
}
【问题讨论】:
-
请注意:Azure 现在有 SignalR 服务 azure.microsoft.com/en-us/services/signalr-service
-
你可以尝试在 UWP 上使用 Azure SignalR Service + NuGet Microsoft.AspNetCore.SignalR.Client (Target SDK 16299)
-
感谢您的回复。我设法让它更早地与 Azure 结合使用(主机是作为 WebApp 运行的 .net 4.7.1 web api),只是这次我想完全离线运行这个解决方案。更多背景信息:我正在为我未来的房子里控制灯、电源适配器等创建一个解决方案。有一段时间没有可用的互联网是可悲的现实,所以 Azure 并不是一个真正可靠的选择。
-
如果您使用 Windows 10 1803 的 Min/Target,这是 bug in SignalR for .Net Core 2.1。
-
@magicandre1981 这不是与上述问题相关的错误。但是,如果您设法让 SignalR 实际连接(例如根据下面的答案采用正确的包),您确实会遇到
System.Memory异常。将秋季更新操作系统作为最低操作系统将暂时解决此问题...
标签: c# uwp windows-10-iot-core asp.net-core-signalr asp.net-core-2.1