.Net core 3.1 控制台应用程序中没有“Microsoft.AspNetCore.Hosting.Server.IServer”类型的服务已注册错误

Posted

技术标签:

【中文标题】.Net core 3.1 控制台应用程序中没有“Microsoft.AspNetCore.Hosting.Server.IServer”类型的服务已注册错误【英文标题】:No service for type 'Microsoft.AspNetCore.Hosting.Server.IServer' has been registered error in .Net core 3.1 console app 【发布时间】:2022-01-15 17:17:32 【问题描述】:

我在 .net core 3.1 中有一个带有 SignalR 实现的控制台应用程序。我正在尝试自行托管应用程序,但出现错误: 例外:没有注册类型“Microsoft.AspNetCore.Hosting.Server.IServer”的服务。 我正在尝试实现信号器功能。我有一个包含所有集线器方法实现的 MyHub 类。 在 Program.cs 中

static void Main(string[] args)

    Thread webThread = new Thread(webSocket);
    webThread.Start();

public static void webSocket()

    IWebHost host = null;
    try
    
        var url = "http://localhost:5001";
        Console.WriteLine("In WebSocket");
              
        var hostBuilder = new WebHostBuilder()                  
                .UseUrls(url)
                .UseStartup<Startup>()
                .Build();

        hostBuilder.Run();
              
        Console.WriteLine("Server running on 0", url);
        Console.ReadLine();
    
    catch (Exception exc)
    
        Console.WriteLine("In Websocket exception");
        Console.WriteLine(exc.Message);              
               

启动:

public class Startup

    public IConfiguration Configuration  get; 
    public Startup(IConfiguration configuration)
    
        Configuration = configuration;
    
    public void ConfigureServices(IServiceCollection services)
    
        services.AddSignalR();
        //services.AddControllers();
        //services.AddMvcCore();
        // return services.BuildServiceProvider();

    
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    
        app.UseRouting();
        //app.UseHttpsRedirection();
        //app.UseCors();         
        app.UseEndpoints(endpoints =>
        
            //endpoints.MapControllers();
            endpoints.MapHub<MyHub>("signalr/myHub");
        );
    

【问题讨论】:

为什么不使用默认的builder静态方法:Host.CreateDefaultBuilder 【参考方案1】:

我认为您的代码应该参考the .net framework self-host 文档进行编码,但您使用的是.net core。

如果想在.net core中使用,hub的定义和使用请继续参考以下文档。

Use hubs in SignalR for ASP.NET Core

请注意一个问题,我的代码是从你那里复制的。我觉得是hub的访问路径不对。

由于你的代码是从基于.net框架的signalr自托管获取的,路径错误。即使当前错误已解决,它仍可能不可用。

Startup.cs 文件

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.HttpsPolicy;
using Microsoft.AspNetCore.SignalR;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

namespace core_selfhost

    public class Startup
    
        public IConfiguration Configuration  get; 
        public Startup(IConfiguration configuration)
        
            Configuration = configuration;
        
        public void ConfigureServices(IServiceCollection services)
        
            services.AddSignalR();
            //services.AddControllers();
            //services.AddMvcCore();
            // return services.BuildServiceProvider();

        
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        
            app.UseRouting();
            //app.UseHttpsRedirection();
            //app.UseCors();         
            app.UseEndpoints(endpoints =>
            
                //endpoints.MapControllers();
                endpoints.MapHub<MyHub>("/signalr/myHub");
            );
        
    
        public class MyHub : Hub
        
            public void Send(string name, string message)
            

                Clients.All.SendAsync(name, message);
            
        
    


mohammadreza 说的没错,如果你对 WebHostBuilder 的配置不是很熟悉,建议使用 CreateDefaultBuilder。

按照您的步骤,我已经重现了问题。你可以查看下面的代码,它对我很有用。

 public static void Main(string[] args)
 
     // CreateHostBuilder(args).Build().Run();
     Thread webThread = new Thread(webSocket);
     webThread.Start();
 
 public static void webSocket()
 
     IWebHost host = null;
     try
     
         var url = "http://localhost:8080";
         Console.WriteLine("In WebSocket");

         var hostBuilder = new WebHostBuilder().UseUrls(url)
             .UseIISIntegration()
             .UseKestrel()
             .UseStartup<Startup>()
             .Build();

         hostBuilder.Run();

         Console.WriteLine("Server running on 0", url);
         Console.ReadLine();
     
     catch (Exception exc)
     
         Console.WriteLine("In Websocket exception");
         Console.WriteLine(exc.Message);
     
 

测试结果

【讨论】:

你能展示一下你的入门课程吗? @snehalgiramkar 当然,请稍候。 @snehalgiramkar 我仔细检查了你的代码,通过我的步骤你可以解决当前的问题,但是可能是hub路径有问题。 是的,现在网络主机工作正常。但是 signalR Myhub 无法正常工作。你能帮忙实现 Hub 方法吗?现在我在 MyHub 类的 Send 方法上遇到错误

以上是关于.Net core 3.1 控制台应用程序中没有“Microsoft.AspNetCore.Hosting.Server.IServer”类型的服务已注册错误的主要内容,如果未能解决你的问题,请参考以下文章

TakeLast 在 .net core 3.1 中无法按预期工作

Asp.Net Core 3.1 控制器方法未调用

.net core 3.1将ajax对象列表发布到MVC控制器没有数据到达

在 .NET Core 3.1 中使用 ImageSource?

从 2.2 迁移到 3.1 的 ASP.Net Core 解决方案在发布时不会运行

如何在 ASP.NET Core 3.1 中使用 Java?