SignalR AzureFunction客户端到AspNetCore WebApi Hub连接

时间:2019-11-06 11:04:37

标签: c# asp.net-core signalr asp.net-core-signalr

我有一个webapi(aspnet核心2.2)应用程序,该应用程序调用了azure函数,该函数随后启动了signalR连接,并向套接字填充了数据负载,然后关闭了。

直到今天运转良好,显然现在似乎已经发生了变化(大概是signalR客户端/服务器软件包更新),但以下情况却打破了这一点……

  

已执行“执行”(失败,Id = e2e2a0f8-f56d-4fe1-a445-598b9338cb92)   [06/11/2019 10:40:32] System.Private.CoreLib:发生异常   执行功能:执行。   Microsoft.AspNetCore.Http.Connections.Common:无效的协商   收到回复。 Microsoft.AspNetCore.Http.Connections.Common:   键入初始化   'Microsoft.AspNetCore.Http.Connections.NegotiateProtocol'引发了   例外。 System.Text.Json:找不到方法:'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添加nuget引用。两端的Json对此问题没有影响。

更新

因此,除了基于.Net Standard 2.x的.Net Standard程序集之外,今天上午我将整个解决方案升级到了.Net Core 3.0。

这样做,我可以为新的System.Text.Json api或Newtonsoft.Json的api引用相关的协议程序集,但是这样做会遇到更多问题:

它仍然不起作用,导致异常...

已执行“执行”(失败,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和与.Net Core集线器通信的基于Web的客户端,因此我都无法在.Net Core 2.x或.Net Core 3.x下运行似乎可以在任何地方找到所有这些功能?

1 个答案:

答案 0 :(得分:0)

看起来这是内部版本的缓存问题。 对于单个构建配置,清理构建似乎会导致“在某些情况下我无法固定”该构建,从而从另一个构建def获取组装的版本。

最终结果是,在整个解决方案中,我对nuget缓存和bin文件夹进行了完整的手动清理,并且全部恢复正常。

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