【问题标题】:SignalR Webhost with ASP.NET Core 2.1 and UWP app as Client returns ' 405 Method not allowed'SignalR Webhost 与 ASP.NET Core 2.1 和 UWP 应用程序作为客户端返回“405 方法不允许”
【发布时间】:2018-11-12 13:18:09
【问题描述】:

我现在为此苦苦挣扎了一段时间,但我无法让它发挥作用。我有 2 个应用程序,都在带有 Win IoT 的 Raspberry Pi 2 上运行:

  • ASP.NET Core 2.1 Web Api - 在这个 WebApi 中,我正在运行 SignalR 主机(发布为 win8-arm win10-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


【解决方案1】:

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

类似的包名称可能很容易在项目中滑落而不会引起注意。

【讨论】:

    猜你喜欢
    • 2019-07-28
    • 1970-01-01
    • 2020-07-06
    • 2019-05-18
    • 2019-09-22
    • 2020-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多