项目说明 ======= 项目主要学习WebAPI启动项设置,特别是默认启始页设置。特别是在部署为子站点时的默认启动页。 常用方法: + 路由+重定向 ```csharp //6.0及以上版本 app.Map("/", async context => { //重定向到目录位置 context.Response.Redirect("swagger/index.html"); await Task.CompletedTask; }); //或者MapGet方法 //老版本写法 app.UseEndpoints(endpoints => { //默认打开Swagger endpoints.Map("/", async context => { context.Response.Redirect($"{context.Request.PathBase}/swagger/index.html"); await Task.CompletedTask; }); }); ``` + 路由+自定义内容 ```csharp namespace LaunchUrlStudy.SubSite2 { public class Program { public static void Main(string[] args) { var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers(); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); var app = builder.Build(); app.UseSwagger(); app.UseSwaggerUI(); app.UseAuthorization(); app.MapControllers(); app.MapGet("/", async context => { //绝对Url string swaggerUrl = Microsoft.AspNetCore.Http.Extensions.UriHelper.BuildAbsolute(context.Request.Scheme, context.Request.Host, context.Request.PathBase, "/swagger/index.html"); //相对Url string swaggerUrl2 = Microsoft.AspNetCore.Http.Extensions.UriHelper.BuildRelative(context.Request.PathBase, "/swagger/index.html"); context.Response.ContentType = "text/html"; var wellcomHtml = $""" {AppDomain.CurrentDomain.FriendlyName}

{AppDomain.CurrentDomain.FriendlyName} 启动成功!

详情参阅:Swagger 文档

"""; await context.Response.WriteAsync(wellcomHtml); }); app.Run(); } } } ``` + 路由+html文件 ```csharp namespace LaunchUrlStudy.SubSite3 { public class Program { public static void Main(string[] args) { var builder = WebApplication.CreateBuilder(args); // 配置IoC builder.Services.AddControllers(); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); var app = builder.Build(); // 配置请求管道 app.UseSwagger(); app.UseSwaggerUI(); app.UseAuthorization(); app.MapControllers(); app.Map("/", async context => { context.Response.ContentType = "text/html"; await context.Response.SendFileAsync(Path.Combine(app.Environment.ContentRootPath, "index.html")); }); app.Run(); } } } ``` + 自定义中间件+重定向 ```csharp namespace LaunchUrlStudy.SubSite4 { public class Program { public static void Main(string[] args) { var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.AddControllers(); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); var app = builder.Build(); app.UseSwagger(); app.UseSwaggerUI(); app.UseAuthorization(); app.MapControllers(); //配置启动地址(支持子站点):自定义中间件+重定向 app.Use(async (context, next) => { if (context.Request.Path == "/" || context.Request.Path == "") { context.Response.Redirect($"{context.Request.PathBase}/swagger/Index.html"); } else { await next(); } }); app.Run(); } } } ``` + 第三方中间件:`Swagger中间件` 子站点时,末尾必须是/才能正确 ```csharp namespace LaunchUrlStudy.SubSite5 { public class Program { public static void Main(string[] args) { var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers(); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); var app = builder.Build(); app.UseSwagger(); // 配置启动地址(不支持子站点):设置Swagger中间件 app.UseSwaggerUI(config => { config.SwaggerEndpoint("swagger/v1/swagger.json", "My API V1"); config.RoutePrefix = string.Empty; }); app.UseAuthorization(); app.MapControllers(); app.Run(); } } } ``` + 第三方中间件:`健康检查中间件` 即默认为健康检查地址 ```csharp namespace LaunchUrlStudy.SubSite6 { public class Program { public static void Main(string[] args) { var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.AddControllers(); builder.Services.AddHealthChecks(); var app = builder.Build(); app.UseAuthorization(); app.MapControllers(); //配置启动地址(支持子站点):第三方 `健康检查中间件` app.UseHealthChecks(""); app.Run(); } } } ``` + 使用静态文件服务器:UseDefaultFiles和UseStaticFiles ```csharp namespace LaunchUrlStudy.SubSite7 { public class Program { public static void Main(string[] args) { var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.AddControllers(); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); var app = builder.Build(); app.UseSwagger(); app.UseSwaggerUI(); app.UseAuthorization(); app.MapControllers(); // 配置启动地址(支持子站点):静态文件服务器默认页 // 只能是wwwroot里的静态真实文件,不能是"swagger/index.html"(因为它是㠌入的资源文件,不在wwwroot中) app.UseDefaultFiles(new DefaultFilesOptions() { DefaultFileNames = new[] { //可以是静态文件 "index.html", //不能是虚拟文件:因为它是㠌入的资源文件,不在wwwroot中 //"swagger/index.html" } }); app.UseStaticFiles(); app.Run(); } } } ``` + 环境变量与配置文件:不推荐 思路是:在配置或环境变量中设置一个指定的变量,在程序代码中读取其值后,配置使用。 这需要事先知道子站点的值,不灵活。环境变量可以在Docker中使用,配置文件就太不灵活了。 + 部署配置:不推荐 在部署 ASP.NET 6 Web API时,配置服务器或反向代理服务器(如Nginx或Apache)来处理默认请求。例如,在Nginx配置中设置默认页面: ```lua server { listen 80; server_name yourdomain.com; location / { proxy_pass http://localhost:5000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection keep-alive; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } } ``` + 使用URL重写规则:不推荐 在使用IIS或Nginx等软件代理时,可以设置URL重写规则。因为需要引入组件和配置规则,相对来说太麻烦,不推荐使用。 总结: + 优先使用: 自定义路由(重定向或自定义内容或文件) 和 自定义中间件,简单、灵活、支持站点也支持子站点; + 如果启用了静态站点服务,可以配置 UseDefaultFiles ,可以指定静态站点中的html文档; + 如果默认地址,用作 `健康检查路径`,也可以直接设置`健康检查路径`为站点首页; + 其它方式不是不灵活就是太麻烦,不推荐使用。Swagger设置为首页时,也推荐使用 自定义路由或中间件;