gpt4 book ai didi

asp.net-core-signalr - 将自托管 SignalR 服务器添加到 .Net Core Worker 服务

转载 作者:行者123 更新时间:2023-12-05 07:12:28 24 4
gpt4 key购买 nike

我正在尝试扩展 .NET Core Worker Service ( <Project Sdk="Microsoft.NET.Sdk.Worker"> ) 与 SignalR(自托管网络应用)。
我发现的所有示例/教程/文档都是基于 Web 应用程序的,因此它们不适合我的情况。

这是我到目前为止所做的:
我的服务程序.cs:

    public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}

public static IHostBuilder CreateHostBuilder(string[] args) =>

Host.CreateDefaultBuilder(args)
.UseWindowsService()
.ConfigureServices((hostContext, services) =>
{
services.AddHostedService<Worker>();
DependencyBuilder.Build(hostContext, services); // inject the stuff I need in my service

// create a SignalR Web host
SignalRWebHostCreator.CreateHost(services, "http://localhost:8090", (endpoints) => {
endpoints.MapHub<MyHub>("/result");
});
});
}

以及我想使用 SignalR 服务器应用程序“扩展”服务的类。


public class SignalRWebHostCreator
{
public static void CreateHost(IServiceCollection services, string serviceUrl, Action<IEndpointRouteBuilder> mapHubs)
{
services.AddSignalR(); // is it ok here ?

WebHost.CreateDefaultBuilder()
.UseUrls(serviceUrl)
.Configure((IApplicationBuilder app) => {
app.UseRouting();

app.Map("/check", config => { // just a test: it works!
config.Run(async context =>
{
context.Response.ContentType = "text/plain";
byte[] data = System.Text.Encoding.UTF8.GetBytes("OK");
await context.Response.Body.WriteAsync(data, 0, data.Length);
await context.Response.Body.FlushAsync();
});
});

app.UseEndpoints(endpoints =>
{
//endpoints.MapHub<ClockHub>("/hubs/clock"); // ERROR
//endpoints.MapHub<PingHub>("/ping"); // ERROR
//mapHubs(endpoints); // ERROR
});
})
.Build().Run();
}
}

(ClockHub 取自 MS 示例,PingHub 是我尝试使用的另一个简单集线器,而不是我的“注入(inject)”集线器)

它会正确启动 Web 应用程序并正确响应 url http://localhost:8090/check

当我取消注释对 enpoint.MapHub() 的调用时或我的自定义操作出现此错误:

System.InvalidOperationException: '无法找到所需的服务。请通过在应用程序启动代码中对“ConfigureServices(...)”的调用中调用“IServiceCollection.AddSignalR”来添加所有必需的服务。

第二次尝试:
好像 service.AddSignalR()没有完成它的工作,所以我在 SignalRWebHostCreator 中添加了这个:

.Configure((IApplicationBuilder app) => {
app.ApplicationServices = services.BuildServiceProvider();

现在我有这个错误:
System.InvalidOperationException:“在尝试激活‘Microsoft.AspNetCore.Routing.EndpointRoutingMiddleware’时无法解析‘System.Diagnostics.DiagnosticListener’类型的服务。”

至少有一个调用栈:
_这个异常最初是在这个调用栈中抛出的:
Microsoft.Extensions.Internal.ActivatorUtilities.ConstructorMatcher.CreateInstance(System.IServiceProvider)
Microsoft.Extensions.Internal.ActivatorUtilities.CreateInstance(System.IServiceProvider, System.Type, object[])
Microsoft.AspNetCore.Builder.UseMiddlewareExtensions.UseMiddleware.AnonymousMethod__0(Microsoft.AspNetCore.Http.RequestDelegate)
Microsoft.AspNetCore.Builder.ApplicationBuilder.Build()
Microsoft.AspNetCore.Hosting.WebHost.BuildApplication()
Microsoft.AspNetCore.Hosting.WebHost.StartAsync(System.Threading.CancellationToken)
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(System.Threading.Tasks.Task)
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(System.Threading.Tasks.Task)
System.Runtime.CompilerServices.TaskAwaiter.GetResult()_

如果我添加 services.AddSingleton(new System.Diagnostics.DiagnosticListener("diagnostic listener"));我可以使用 endpoints.MapHub(..)没有错误,但现在调用 http://8090/check返回 500 内部错误,所以我认为这不是解决问题的正确方法。

我从 Microsoft.Owin.hosting 找到了一些使用 WebApp 的示例。
它需要 Microsoft.Owin.4.1.0Microsoft.Owin.Hosting.4.1.0Owin.1.0.0 以及最后一个需要 Net Framework 4.6.1,我不要这个。
我包含了 Microsoft.AspNetCore.Owin.3.1.2(100% .NET Core),但它不提供 WebApp 或类似的东西。

最佳答案

当我将 nuget EFCore 包升级到新版本时,我开始遇到同样的错误。

我注意到,在我的 bin 目录中,出现了一个 System.Diagnostics.DiagnosticSource.dll,而当我降级时,它消失了。

我怀疑,来自旧程序集版本的 DiagnosticListener 类型已在 DI 容器中注册,而在激活时需要更新版本。或者反过来 - 我没有深入研究。

我的解决方案是恢复 EFCore 以匹配 System.Diagnostics.DiagnosticSource.dll 的产品版本,这样它就不会出现在 bin 文件夹中。

关于asp.net-core-signalr - 将自托管 SignalR 服务器添加到 .Net Core Worker 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60417207/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com