You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
9.9 KiB
9.9 KiB
项目说明
项目主要学习WebAPI启动项设置,特别是默认启始页设置。特别是在部署为子站点时的默认启动页。
常用方法:
-
路由+重定向
//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; }); });
-
路由+自定义内容
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 = $""" <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>{AppDomain.CurrentDomain.FriendlyName}</title> </head> <body> <div style="text-align:center"> <h2>{AppDomain.CurrentDomain.FriendlyName} 启动成功!</h2> <h3>详情参阅:<a href="{swaggerUrl}">Swagger 文档</a></h3> </div> </body> </html> """; await context.Response.WriteAsync(wellcomHtml); }); app.Run(); } } }
-
路由+html文件
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(); } } }
-
自定义中间件+重定向
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中间件
子站点时,末尾必须是/才能正确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(); } } }
-
第三方中间件:
健康检查中间件
即默认为健康检查地址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
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配置中设置默认页面:
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设置为首页时,也推荐使用 自定义路由或中间件;