在某些情况下,我们可能需要在 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 服务器侦听 https://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:https://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 操作:
https://localhost:8888/api/v1.0/tasks
源代码获取:公众号回复消息【code:42646】