SignalR Webhost ASP.NET Core 2.1 和 UWP 应用程序作为客户端 returns '405 方法不允许'

SignalR Webhost with ASP.NET Core 2.1 and UWP app as Client returns ' 405 Method not allowed'

我为此苦苦挣扎了一段时间,但无法正常工作。我有 2 个应用程序,都在 运行ning 上 Raspberry Pi 2 with Win IoT:

当我将 Web Api 部署到 Raspberry 时,一切都很好。我有一个测试控制台应用程序充当客户端,可以毫无问题地连接到 SignalR 主机。 当我部署 UWP 应用程序并尝试 运行 它时,它在 hubConn.Start(...) HubConnection 的方法和 returns 错误:

HttpClientException: StatusCode: 405, ReasonPhrase: 'Method Not Allowed', Version: 1.1, Content: System.Net.Http.StreamContent, Headers: { Server: Kestrel Date: Sat, 02 Jun 2018 17:04:15 GMT
Content-Length: 0 Content-Type: text/plain }

测试控制台和 UWP 都在使用 Microsoft.AspNet.SignalR.Client (2.2.3) nuget 包(这是最新的)。 ASP.NET Core 2.1 Web Api 正在使用 Microsoft.AspNetCore.App SDK (2.1.0)。

通过阅读此 post 我熟悉了这样一个事实,即 SignalR 不向后兼容作为客户端的主机。但我希望当我使用最新的 nuget 包和 nuget 上可用的版本时,一切都会正常工作。

我也不明白为什么测试控制台实际上能够无错误地连接,但 UWP 应用程序甚至没有使用相同的 SignalR 客户端 nuget 包。

此外,我知道 ASP.NET Core 2.1 包和 SignalR Client 包是 2 个不同的包,但我无法将 nuget 包 Microsoft.AspNetCore.App 添加到 UWP 项目,因为它不兼容使用任何 win10-arm 平台。

知道如何建立连接并 运行ning 吗?

2018 年 6 月 4 日更新问题

我删除了我之前在这个问题中的假设。我以为测试控制台应用程序已成功连接,但事实并非如此。不同之处在于测试控制台尝试同步连接,但这导致了错误的吞噬。我验证了与 SignalR 主机的连接状态,从 'Connecting' 直接变为 'Disconnected'。

问题仍然存在:如果我想使用 ASP.NET Core 2.1 SignalR,我应该在我的测试控制台应用程序以及我的 UWP 项目中包含哪个 nuget 包?

这里是一些代码;所有项目都是完全默认的,通过文件 - 新建项目,加上下面的代码。

ASP.NET 核心 2.1 网络 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());
    }
}

我实际上使用了错误的 NuGet 包。我想要 Microsoft.AspNetCore.SignalR.Client(注意名称中的 AspNetCore 而不是 AspNet)。不过,很容易把它们搞混。我使用的包是 ASP.NET SignalR 的客户端,我需要参考的是 ASP.NET Core SignalR 的客户端。

相似的包名可能很容易在项目中溜走而不注意。