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.

243 lines
9.6 KiB
C#

4 months ago

using System.Text;
using System.Diagnostics;
using System.Threading ;
using System.Collections.Generic;
9 months ago
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Http.Features;
9 months ago
using Microsoft.AspNetCore.Server.Kestrel.Core;
using Microsoft.IdentityModel.Tokens;
using Microsoft.OpenApi.Models;
using HttpClientStudy.Model;
using HttpClientStudy.Service;
using HttpClientStudy.Config;
namespace HttpClientStudy.WebApp
{
/// <summary>
4 months ago
/// HttpClient学习WebAPI项目
/// </summary>
public class Program
{
/// <summary>
/// Main
/// </summary>
4 months ago
/// <param name="args">启动参数</param>
public static void Main(string[] args)
{
5 months ago
string projectAndMutexName = WebApiConfigManager.GetWebApiConfigOption().CurrentValue.WebAppMutexName;
var mutex = new Mutex(true,projectAndMutexName,out bool createdResult);
if (createdResult == false)
{
4 months ago
Console.WriteLine($"已经有一个实例在运行,本实例退出!");
5 months ago
return;
}
var builder = WebApplication.CreateBuilder(args);
4 months ago
#region 加载配置文件
var configBasePath = AppContext.BaseDirectory;
4 months ago
Console.WriteLine($"WebApp配置文件根目录{configBasePath}");
builder.Configuration.SetBasePath(configBasePath);
3 months ago
//环境变量
builder.Configuration.AddEnvironmentVariables();
//配置文件
builder.Configuration.AddJsonFile("appsettings.json", false, true);
builder.Configuration.AddJsonFile($"appsettings.{builder.Environment.EnvironmentName}.json", true, true);
builder.Configuration.AddJsonFile($"configFiles/Config.json", false, true);
3 months ago
//命令行参数
builder.Configuration.AddCommandLine(args);
#endregion
4 months ago
#region 向容器注册服务
builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
4 months ago
//Session中间件依赖项
builder.Services.AddDistributedMemoryCache();
4 months ago
//配置Session
builder.Services.AddSession(option =>
{
option.Cookie.Name = "HttpClientStudy";
option.IOTimeout = TimeSpan.FromHours(1);
option.IdleTimeout = TimeSpan.FromHours(1);
});
4 months ago
//配置Kestrel服务器选项
builder.Services.Configure<KestrelServerOptions>(option =>
9 months ago
{
4 months ago
//ASP.NET Core 3.0 之前的版本AllowSynchronousIO 默认是开启的
//设置 true :允许同步 IO 操作,这样允许接收Get请求中的请求体数据.但只能直接从流中读取,不能自动模型绑定。
9 months ago
option.AllowSynchronousIO = true;
});
4 months ago
//配置Form表单提交选项
builder.Services.Configure<FormOptions>(options =>
{
//options.BufferBody = true;
options.MultipartBodyLengthLimit = long.MaxValue;
options.MultipartBoundaryLengthLimit = int.MaxValue;
options.MultipartHeadersCountLimit = int.MaxValue;
options.MultipartHeadersLengthLimit = int.MaxValue;
});
4 months ago
//配置Swagger
builder.Services.AddSwaggerGen(setup =>
{
4 months ago
#region 定义Swagger文档
//name参数即为SwaggerUI中SwaggerEndpoint方法参数中的{documentName}
//两者必须保持一致,否则异常
setup.SwaggerDoc(name: "v1", new Microsoft.OpenApi.Models.OpenApiInfo { Title = "HttpClient学习", Version = "第1版" });
#endregion
4 months ago
#region 包含xml注释
var xmlCommentFiles = System.IO.Directory.GetFiles(AppDomain.CurrentDomain.BaseDirectory, "HttpClientStudy.*.xml", System.IO.SearchOption.TopDirectoryOnly);
foreach (var xmlFile in xmlCommentFiles)
{
4 months ago
//includeControllerXmlComments参数是否启用控制器上的xml注释
setup.IncludeXmlComments(filePath: xmlFile, includeControllerXmlComments: true);
setup.UseInlineDefinitionsForEnums();
}
#endregion
4 months ago
#region 放置接口Auth授权按钮
setup.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
{
4 months ago
Description = "请输入带有Bearer的TokenBearer {Token}",
4 months ago
//jwt默认的参数名称
Name = "Authorization",
4 months ago
//jwt默认存放 Authorization 信息的位置:此处为请求头中
In = ParameterLocation.Header,
4 months ago
//验证类型此处使用Api Key
Type = SecuritySchemeType.ApiKey
});
#endregion
4 months ago
#region 指定方案应用范围
setup.AddSecurityRequirement(new OpenApiSecurityRequirement
{
{
new OpenApiSecurityScheme
{
Reference = new OpenApiReference
{
Id = "Bearer",
Type = ReferenceType.SecurityScheme
}
},
new List<string>()
}
});
#endregion
4 months ago
//启用数据注解
setup.EnableAnnotations();
});
4 months ago
//配置CORS跨域
builder.Services.AddCors(option =>
{
option.AddPolicy("AllowAll", builder =>
{
builder.SetIsOriginAllowed(_ => true).AllowAnyMethod().AllowAnyHeader().AllowCredentials();
});
});
4 months ago
//认证
builder.Services //认证基础架构
6 months ago
.AddAuthentication(authOption =>
{
authOption.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
authOption.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme;
authOption.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
authOption.DefaultSignOutScheme = CookieAuthenticationDefaults.AuthenticationScheme;
authOption.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
})
4 months ago
//Cookie认证
.AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, option =>
{
4 months ago
option.Cookie.Name = ".eds.editor.cookie.authentication.oa2";//设置存储用户登录信息用户Token信息的Cookie名称
option.Cookie.HttpOnly = true;//设置存储用户登录信息用户Token信息的Cookie无法通过客户端浏览器脚本(如JavaScript等)访问到
option.ExpireTimeSpan = TimeSpan.FromDays(3);// 过期时间
option.SlidingExpiration = true;// 是否在过期时间过半的时候,自动延期
option.LoginPath = "/Account/Login";
option.LogoutPath = "/Account/LoginOut";
//option.AccessDeniedPath = "/Account/Login";
})
4 months ago
//认证
.AddJwtBearer(option =>
{
option.TokenValidationParameters = new TokenValidationParameters
{
ValidIssuer = "WWW.WANGGAOFENG.CN",
ValidAudience = "WWW.WANGGAOFENG.CN",
ValidateIssuer = true,
ValidateLifetime = true,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("0123456789abcdefghigklmnopqrstdf41sadfweqtdfghsdfgsdfweqr")),
4 months ago
//缓冲过期时间总的有效时间等于这个时间加上jwt的过期时间
ClockSkew = TimeSpan.FromSeconds(0)
};
});
4 months ago
//授权
builder.Services.AddAuthorization();
9 months ago
4 months ago
//健康检查
builder.Services.AddHealthChecks();
4 months ago
//普通类
builder.Services.AddScoped(provider => new Account() { Id = 0, Name = "服务注入示例", Password = "123456", Role = "IoC" });
9 months ago
builder.Services.AddScoped<AccountService>();
#endregion
var app = builder.Build();
4 months ago
#region 配置Http管道
8 months ago
4 months ago
//耗时统计中间件
8 months ago
app.UseMiddleware<UsedTimeMiddleware>();
app.MapHealthChecks("api/health");
app.UseSwagger();
app.UseSwaggerUI(setup =>
{
setup.EnableDeepLinking();
setup.DisplayRequestDuration();
setup.ShowCommonExtensions();
setup.ShowExtensions();
setup.EnableFilter();
});
app.UseCors("AllowAll");
app.UseAuthorization();
app.MapControllers();
app.UseAuthorization();
#endregion
//默认Swagger页
app.Map("/", async context =>
{
context.Response.Redirect($"{context.Request.PathBase}/swagger/index.html");
await Task.CompletedTask;
});
app.Run();
}
}
}