如何将.NET Core Web API类库内嵌并独立运行?

摘要:话题 我们知道在.NET Framework中可以嵌入运行Web APi,那么在.NET Core(.NET 6+称之为.NET)中如何内嵌运行Web Api呢,在实际项目中这种场景非常常见,那么我们本节以.NET 6.0
话题 我们知道在.NET Framework中可以嵌入运行Web APi,那么在.NET Core(.NET 6+称之为.NET)中如何内嵌运行Web Api呢,在实际项目中这种场景非常常见,那么我们本节以.NET 6.0作为演示示例一起来瞅瞅 内嵌运行.NET Core Web APi 接下来我们通过控制台作为主程序来启动Web APi,首先我们创建名为EmbedWebApi的控制台程序,然后创建Embed.WebApi类库运行Web APi,我们在此Web APi中创建如下接口,并实现相关方法来运行Web APi public class InitTest : IInitTest { public void Init() { var builder = WebApplication.CreateBuilder(); builder.Services.AddControllers(); var app = builder.Build(); app.UseRouting(); app.UseEndpoints(endpoints => { endpoints.MapDefaultControllerRoute(); }); app.Run(); } } public interface IInitTest { void Init(); } 通过写接口并在对应方法中运行Web APi主要是达到在控制中调用该接口进行模拟实现,这里需要注意一点的是,因为我们创建的Web APi是类库,要想使用Web里面的Api等等,直接在项目文件中添加如下一行以表明我们要引用框架,这样一来框架里面所包含的APi等等版本都一致统一,而不是通过NuGet一一下载,这是错误的做法 <ItemGroup> <FrameworkReference Include="Microsoft.AspNetCore.App" /> </ItemGroup> 接下来我们在该类库中按照规范创建Controllers文件夹,并创建测试控制器,如下 using Microsoft.AspNetCore.Mvc; namespace Embed.WebApi.Controllers { [ApiController] [Route("api/[controller]/[action]")] public class TestController : ControllerBase { [HttpGet] public IActionResult Test() { return Ok("Hello World"); } } } 最后我们在控制台程序中注册上述接口并调用初始化方法,如下: internal class Program { static void Main(string[] args) { var services = new ServiceCollection(); services.AddTransient<IInitTest, InitTest>(); var serviceProvider = services.BuildServiceProvider(); var initTest = serviceProvider.GetRequiredService<IInitTest>(); initTest.Init(); Console.Read(); } } 芜湖,我们通过Postman模拟调用测试接口,结果惊呆了,404了~~~ 当我们将类库中的控制器移动到控制台中,此时请求测试接口并成功返回对世界的问候,这是什么原因呢? 不难猜测可知,默认WebAPi控制器的激活以作为入口的主程序集进行查找激活。
阅读全文