1.api如何使用swagger
1.添加Swashbuckle.AspNetCore包 在start.cs 方法ConfigureServices中加入以下内容 services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Version = "v1", Title = "吴限好后端API", Description = "吴限好" }); // 为 Swagger JSON and UI设置xml文档注释路径 var basePath = Path.GetDirectoryName(typeof(Program).Assembly.Location);//获取应用程序所在目录(绝对,不受工作目录影响,建议采用此方法获取路径) var xmlPath = Path.Combine(basePath, "Wxh.xml"); c.IncludeXmlComments(xmlPath); }); 还需要在对应的Configure方法中加入 app.UseSwagger(); app.UseSwaggerUI(c => { c.SwaggerEndpoint("/swagger/v1/swagger.json", "吴限好后端API"); });
2.改变默认端口,同时设置请求最大长度,替换内置容器
Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.ConfigureKestrel(serverOptions => { //限制请求大小最大长度 serverOptions.Limits.MaxRequestBodySize = 10485760; }); webBuilder.UseKestrel().UseUrls("http://*:9991"); webBuilder.UseIIS(); webBuilder.UseStartup<Startup>(); }).UseServiceProviderFactory(new AutofacServiceProviderFactory());//替换内置容器
3.因为框架准备使用前后端分离,所以会面对跨域问题,添加中间件cors(中间件具体解释参考文章https://blog.csdn.net/weixin_46681279/article/details/106721813)
在strat.cs文件,ConfigureServices方法下添加 以下内容
//必须appsettings.json中配置 string corsUrls = Configuration["CorsUrls"]; if (string.IsNullOrEmpty(corsUrls)) { throw new Exception("请配置跨请求的前端Url"); } services.AddCors(option => { option.AddDefaultPolicy( builder => { builder.WithOrigins(corsUrls.Split(",")) //Access-Control-Max-Age标头指定可缓存对预检请求的响应的时间长度 .SetPreflightMaxAge(TimeSpan.FromSeconds(2520)) //服务器必须允许凭据 .AllowCredentials() //许所有作者请求标头 .AllowAnyHeader(). //设置允许的 HTTP 方法 AllowAnyMethod(); } ); });
Configure方法中新增
//需要注意顺序
app.UseCors();
app.UseAuthentication();
app.UseAuthorization();
4.partial controller
启动Api后会出现重载问题需要在swagger下面新增c.ResolveConflictingActions(apiDescriptions => apiDescriptions.First());
以上办法只能解决swagger.xml的问题 未能够找到问题的最终点,在程序调用时,会提示请求匹配两个,在partial添加路由的时候,需要注意配置route的问题,只需要配置一个,或者两 个配置不同
5.登录接口
5.1使用GET的请求只能检索数据,因此不能拥有主体
[HttpPost,Route("login"), AllowAnonymous] [ObjectModelValidatorFilter(ValidatorModel.Login)] public async Task<IActionResult> login([FromBody] LoginInfo loginInfo) { return Json(await Service.Login(loginInfo)); } 在以上代码上我还加入了HttpGet 导致报错ypeError: Failed to execute 'fetch' on 'Window': Request with GET/HEAD method cannot have body.
6. Unable to resolve service
需要将服务注册 例如services.AddScoped<ISys_UserService, Sys_UserService>();
思考是否还有其他办法注入
可以,但是使IDependency成为基类,获取程序集后统一注册,理解可能存在偏差,后期矫正
Type baseType = typeof(IDependency); var compilationLibrary = DependencyContext.Default .CompileLibraries .Where(x => !x.Serviceable && x.Type == "project") .ToList(); var count1 = compilationLibrary.Count; List<Assembly> assemblyList = new List<Assembly>(); foreach (var _compilation in compilationLibrary) { try { assemblyList.Add(AssemblyLoadContext.Default.LoadFromAssemblyName(new AssemblyName(_compilation.Name))); } catch (Exception ex) { Console.WriteLine(_compilation.Name + ex.Message); } } builder.RegisterAssemblyTypes(assemblyList.ToArray()) .Where(type => baseType.IsAssignableFrom(type) && !type.IsAbstract) .AsSelf().AsImplementedInterfaces() .InstancePerLifetimeScope();