在 .NET Windows 窗体应用程序中托管 Kestrel Web 服务器Host Kestrel Web Server in .NET Windows Form Application

作者:微信公众号:【架构师老卢】
1-26 9:34
169

概述:该文章介绍了在Windows窗体应用中托管.NET Core Web服务器的方法,使用Kestrel实现静态内容和Web API,包括配置和NuGet包示例。

在某些情况下,我们可能需要在 Windows 窗体应用程序中托管一个 Web 服务器,并提供静态内容甚至 RESTful API。

Kestrel 是 ASP.NET Core 的跨平台 Web 服务器。Kestrel 是 ASP.NET Core Web 项目模板中默认包含并启用的 Web 服务器。有关 Kestrel Web 服务器的详细信息,您可以访问Microsoft网站:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/servers/kestrel?view=aspnetcore-6.0

在本文中,我们将讨论如何在 Windows 窗体应用程序中托管 Kestrel Web 服务器以提供静态 Web 内容和 Web API。

internal static class Program
{
  [STAThread]
  static void Main()
  {
    Task.Run(() => StartWebServer());
    ApplicationConfiguration.Initialize();
    Application.Run(new Form1());
}
private static void StartWebServer()
{
  var builder = WebHost.CreateDefaultBuilder();
  var app = builder
    .UseKestrel(options => options.Listen(IPAddress.Parse(“127.0.0.1”), 8888))
    .UseContentRoot(Directory.GetCurrentDirectory())
    .UseWebRoot(Path.Combine(Directory.GetCurrentDirectory(), “wwwroot”))
    .Configure(app =>
    {
      app.UseStaticFiles(new StaticFileOptions()
      {
        FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), “wwwroot”)),
        RequestPath = “/”
      });
    }).Build();
  app.Run();
}

由于我们在常规 Windows 窗体应用中托管 Kestrel Web 服务器,因此我们需要创建并运行在不同任务中托管的 Kestrel Web 服务器。

首先,我们调用 WebHost.CreateDefaultBuilder() 来创建一个 Web 主机构建器。然后,我们添加 Kestrel Web 服务器,并将静态文件中间件添加到管道中。

默认情况下,Kestrel Web 服务器侦听 http://localhost:5000/。您可以通过将 Kestrel Web 服务器传递给重载 UseKestrel() 方法来更改希望 Kestrel Web 服务器绑定到的 IP 地址和端口号:

.UseKestrel(options => options.Listen(IPAddress.Parse(“127.0.0.1”), 8888))

静态内容 默认情况下,ASP.NET Core 没有对静态文件的内置支持。若要从 ASP.NET Core 应用提供静态文件,必须使用和配置静态文件中间件。在 .NET Core 中,可以调用 app。UseStaticFiles() 使用静态文件中间件。

ContentRoot 与 WebRoot 我发现这篇文章很好地解释了这两个术语的区别:https://referbruv.com/blog/understanding-contentroot-and-webroot-in-asp-net-core-simplified/

ContentRootPath 是主机查找要运行的可执行文件和程序集的位置。默认情况下,它是运行应用程序时的当前目录。

WebRootPath 是应用程序提供的所有静态文件(如 CSS、JavaScript 或图像文件)的基路径。它实际上是 ContentRootPath 的子路径。

我们的配置将 Web 根文件夹设置为“wwwroot”(顺便说一下,这是默认设置)。因此,您可以将静态内容放入应用程序根文件夹下的“wwwroot”文件夹中,例如 index.html。您可以使用以下 URL 访问此索引 html:http://localhost:8888/index.html

在我们的 Visual Studio 项目中,我们需要添加框架引用和 nuget 包引用,如下所示:

<Project Sdk=”Microsoft.NET.Sdk”>
<PropertyGroup>
  <OutputType>WinExe</OutputType>
  <TargetFramework>net6.0-windows</TargetFramework
  <Nullable>enable</Nullable>
  <UseWindowsForms>true</UseWindowsForms
  <ImplicitUsings>enable</ImplicitUsings>
  <LangVersion>preview</LangVersion>
</PropertyGroup>
<ItemGroup>
  <PackageReference Include=”Microsoft.Extensions.Hosting” Version=”6.0.1" />
</ItemGroup>
<ItemGroup>
  <FrameworkReference Include=”Microsoft.AspNetCore.App” /></ItemGroup>
</Project>

主机 Web API 我们还可以使用 Kestrel 在 Windows 窗体应用中托管 Web API。为此,我们只需要向 Web 主机构建器添加更多配置:

private static void StartWebServer()
{
  var builder = WebHost.CreateDefaultBuilder();
  var app = builder
    .UseKestrel(options => options.Listen(IPAddress.Parse(“127.0.0.1”), 8888))
    .UseContentRoot(Directory.GetCurrentDirectory())
    .UseWebRoot(Path.Combine(Directory.GetCurrentDirectory(), “wwwroot”))
    .ConfigureServices((services) =>
    {
      services.AddControllers().AddNewtonsoftJson();
      services.AddCors();
    })
    .Configure(app =>
    {
      app.UseStaticFiles(new StaticFileOptions()
      {
        FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), “wwwroot”)),
        RequestPath = “/”
      });
      app.UseRouting();
      app.UseCors(builder =>
      {
        builder.AllowAnyOrigin()
               .AllowAnyMethod()
               .AllowAnyHeader();
      });
      app.UseAuthorization();
      app.UseEndpoints(endpoints =>
      {
        endpoints.MapControllers();
      });
    }).Build();
  app.Run();
}

请记住将以下内容添加到 nuget 包中,以便编译上述代码:

Microsoft.AspNetCore.Mvc.NewtonsoftJson Microsoft.Extensions.DependencyInjection 然后,可以在 Controllers 文件夹中创建 Web API 控制器。例如,以下任务控制器:

[ApiController]
[Route("api/v1.0/[controller]")]
public class TasksController : ControllerBase
{
  public TasksController(){}
  [HttpGet("")]
  public IActionResult Get()
  {
    return Ok("hello world");
  }
}

生成并运行后,可以使用以下链接访问任务 API Get 操作:

http://localhost:8888/api/v1.0/tasks

源代码获取:公众号回复消息【code:42646】

相关代码下载地址
重要提示!:取消关注公众号后将无法再启用回复功能,不支持解封!
第一步:微信扫码关键公众号“架构师老卢”
第二步:在公众号聊天框发送code:42646,如:code:42646 获取下载地址
第三步:恭喜你,快去下载你想要的资源吧
相关留言评论
昵称:
邮箱:
阅读排行