SignalR AzureFunction 客户端到 AspNetCore WebApi Hub 连接

SignalR AzureFunction client to AspNetCore WebApi Hub connection

我有一个 webapi (aspnet core 2.2) 应用程序调用一个 azure 函数,该函数反过来启动一个 signalR 连接并在套接字中填充大量数据然后关闭。

直到今天一切正常,显然现在似乎发生了一些变化(大概是 signalR client/server 包更新),但出现以下异常...

Executed 'Execute' (Failed, Id=e2e2a0f8-f56d-4fe1-a445-598b9338cb92) [06/11/2019 10:40:32] System.Private.CoreLib: Exception while executing function: Execute. Microsoft.AspNetCore.Http.Connections.Common: Invalid negotiation response received. Microsoft.AspNetCore.Http.Connections.Common: The type initializer for 'Microsoft.AspNetCore.Http.Connections.NegotiateProtocol' threw an exception. System.Text.Json: Method not found: 'Int32 System.Text.Encodings.Web.TextEncoder.FindFirstCharacterToEncodeUtf8(System.ReadOnlySpan`1)'.

服务器代码如下...

Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    services.AddSignalR();
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseSignalR(routeBuilder => {
        routeBuilder.MapHub<NotificationHub>("/Hubs/Notification");
        routeBuilder.MapHub<WorkflowHub>("/Hubs/Workflow");
    });
}

WorkflowHub.cs

public class WorkflowHub : Hub
{
    public async Task ConsoleSend(string level, string message, string thread)
    {
        await Clients.Group(thread).SendAsync("ConsoleReceive", level, message, thread);
    }
}

...

现在客户端代码(在 azure 函数中)...

Function.cs

var con = new HubConnectionBuilder().WithUrl(msg.Api + "Hubs/Workflow").Build();
con.On<Exception>("error", (ex) => Console.WriteLine(ex.Message + "\n" + ex.StackTrace));
await con.StartAsync();

包版本: 在服务器上... - Microsoft.AspNetCore.Signalr 1.1.0

在 Azure 函数客户端中... - Micorsoft.AspNetCore.Signalr.Client 3.0.0

...

我通常使用 Newtonsoft.Json 来满足我的 Json 需求,但这个新的 System.Text.Json 似乎越来越受欢迎,我不确定这是否是某种版本控制问题,但是在两端添加对 System.Text.Json 的 nuget 引用对这个问题没有影响。

更新

所以我今天早上将整个解决方案升级到 .Net Core 3.0,除了基于 .Net Standard 2.x 的 .Net Standard 程序集。

通过这样做,我可以参考新 System.Text.Json api 或 Newtonsoft.Json 的相关协议程序集,但在这样做时我遇到了更多问题:

还是不行,导致异常...

执行'Execute'(失败,Id=e2265bbb-e59b-4b51-a0dd-d5798adccac1) [11/11/2019 12:50:46] System.Private.CoreLib:执行函数时出现异常:执行。 wf:无法加载文件或程序集 'netstandard, Version=2.1.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'。该系统找不到指定的文件。 System.Private.CoreLib: 无法加载指定的文件。

...但除此之外,我在托管集线器的 WebApi 应用程序中进行的一些调用现在无法进行,似乎 OData 框架不喜欢端点路由并且似乎有github 上的公开票表明此支持仍在进行中。

但无论哪种方式……SignalR 仍然没有发挥作用。

有没有人有一个工作示例,其中有一个 .Net Core 和一个基于 Web 的客户端与一个 .Net Core 集线器通信,所有 运行 在 .Net Core 2.x 或 .Net Core 下3.x 因为我似乎无法在任何地方找到所有这些工作?

看起来这是构建的缓存问题。 为单个构建配置清理你的构建似乎会导致 "under some condition I can't pin down" 构建从另一个构建定义中选择一个版本的程序集。

最终结果是,我对整个解决方案中的 nuget 缓存和 bin 文件夹进行了全面的手动清理,一切都焕然一新。

对我来说似乎是一个工具问题,而不是版本控制/框架问题。