首页 > 技术文章 > WXH前后端分离框架,后端搭建过程知识点记录

1GB-wjw 2021-04-25 13:54 原文

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();

 

推荐阅读