使用Kestrel在.NET Core控制台应用程序中返回HTML视图

时间:2018-07-30 20:16:07

标签: c# asp.net-core .net-core console-application kestrel-http-server

我有.Net Core Console应用程序。我一直在努力使同时运行Process和听port成为可能,这是我的方法:

这是我的program.cs班:

 class Program
{
    static void Main(string[] args)
    {
        var ConsOut = Console.Out; 
        Console.SetOut(new StreamWriter(Stream.Null));
        BuildWebHost(args).Start();                    
        Console.SetOut(ConsOut); 
        while (true)
        {
            RunIbit();
        }
    }

    public static IWebHost BuildWebHost(string[] args)
    {
        var config = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json", optional: true)
            .AddCommandLine(args)
            .Build();

        var host = new WebHostBuilder()
            .UseKestrel()
            .UseConfiguration(config)
            .UseStartup<Startup>()
            .UseIISIntegration()
           .Build();

        return host;
    }


    public static void RunIbit()
    {
        // Execute Proccess.Start();
    }}

这是Startup.cs

public class Startup
{
    public Startup()
    {
        var builder = new ConfigurationBuilder().AddJsonFile("appsettings.json");
        Configuration = builder.Build();
    }

    public IServiceProvider ConfigureServices(IServiceCollection services)
    {
        services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
        services.AddLogging();
        var serviceProvider = services.BuildServiceProvider();
        services.AddSingleton<IConfigurationRoot>(Configuration);

        return WindsorRegistrationHelper.CreateServiceProvider(ContainerManager.Container, services);
    }
     public void Configure(IApplicationBuilder app){
        app.Run(context => {
            return context.Response.WriteAsync("Hello world");
        });
     }
}

由于我想在网页上显示该过程的结果,所以我一直在想,是否有可能以某种方式代替写Hello world? 尝试添加app.UseMvc()而不是app.Run(context => { return context.Response.WriteAsync("Hello world"); });,但它不适用于.net核心控制台应用程序,这是唯一对我有用(或至少对我发现的),但我找不到如何用html文件替换该文本。有人知道吗?

1 个答案:

答案 0 :(得分:1)

  

我已经尝试了一段时间,以便可以同时运行Process和侦听端口

简短答案:

  1. 将引用包作为依赖项
  2. 配置服务并添加中间件以服务传入的请求
  3. 根据需要使用自己的控制器和视图

这是详细的操作方法:

我不确定您是要通过MVC解决方案还是通过静态html文件实现目标,因此我为您提供了两种解决方案:

计划A:我注意到您已经说过

  

试图添加app.UseMvc()...但是id无效

首先使用MVC配置控制台程序。

方案B:为控制台配置静态文件。

提醒一下,计划A或计划B都需要一个Microsoft.NET.Sdk.Web SDK。因此,我们必须首先引用正确的SDK,即将项目sdk从Microsoft.NET.Sdk更改为Microsoft.NET.Sdk.Web

<Project Sdk="Microsoft.NET.Sdk.Web">
   <!-- ... -->
</Project>

计划A

  1. 我们需要首先在您的.csproj文件中添加软件包引用:

    <Project Sdk="Microsoft.NET.Sdk.Web">
      <PropertyGroup>
        <TargetFramework>netcoreapp2.0</TargetFramework>
      </PropertyGroup>
      <ItemGroup>
        <Folder Include="wwwroot\" />
      </ItemGroup>
      <ItemGroup>
        <PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.5" />
      </ItemGroup>
      <ItemGroup>
        <Content Update="appsettings.json">
          <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
        </Content>
      </ItemGroup>
</Project>

  1. ,然后您可以在Startup类中配置MVC:

        public void ConfigureServices(IServiceCollection services)
        {
            // ...
    
            services.AddMvc();     // add mvc services here
    
            // ...
        }
    
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
    
            app.UseMvcWithDefaultRoute();   // use mvc  here
    
            app.Run(context => {
                return context.Response.WriteAsync("Hello world");
            });
        }
    
  2. 最后,您可以根据需要添加控制器和视图文件。例如,如果您添加带有Index操作的HelloController,并且对应的视图文件是:

    @ {     ViewData [“ Title”] =“索引”; }

    索引

    它wooooooooooooooooooooooks

访问URL /hello时,您将得到预期的响应 tes-console-with-mvc

计划B

您只需在项目中添加一个wwwroot目录,然后使用UseStaticFiles()方法中的Configure()注册一个中间件:

public void Configure(IApplicationBuilder app, IHostingEnvironment env){
    // ...

    // app.UseMvcWithDefaultRoute();

    app.UseStaticFiles();     // add a StaticFiles middleware here

    app.Run(async context => {
        await context.Response.WriteAsync("Hello,world");
    });
}