.Net Core/.Net6/.Net8 ,启动配置/Program.cs 配置

.Net Core/.Net6/.Net8 ,启动配置/Program.cs 配置

  • 没有废话,直接上代码
  • 调用

没有废话,直接上代码


	    /// <summary>
	    /// 启动类
	    /// </summary>
		public static class Mains{
		static IServiceCollection _services;
		static IMvcBuilder _mvc;

		public static WebApplicationBuilder Main(this WebApplicationBuilder builder,IMvcBuilder mvc=null){
			
            _services = builder.Services;
            _mvc = mvc;

			// 增加Http组件
			_services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
			
			//在请求生命周期内,可以读取
			//web服务器信息,包括域名,客户端ip 等
			Web._service = _services;
			
			//读取appsetting.config内容  AppSettings.ConfigItems["xx"]/AppSettings.ConfigItems["a:b"]
			AppSettings.ConfigItems = builder.Configuration;
			
			//添加 cookie 静态类
			Cookies.serviceCollection = builder.Services;
			//自动批量注册服务
			AddService();

			//单独注册某个服务,特殊情况
			_services.AddSingleton<Ixxx,xxx>();
			
			 //添加拦截器
			 _services.AddControllersWithViews(x =>
			 {
			 	 //全局返回,统一返回格式
			     x.Filters.Add<ResAttribute>();
			     
			     //全局日志,报错
			     x.Filters.Add<LogAttribute>();
				 
				 //全局身份验证
			     x.Filters.Add<TokenAttribute>();
			 });

			//式化响应
            _services.AddControllers().AddJsonOptions(options =>
            {

                //时间格式化响应
                options.JsonSerializerOptions.Converters.Add(new JsonOptionsDate("yyyy-MM-dd HH:mm:ss"));

                //int格式化响应
                options.JsonSerializerOptions.Converters.Add(new JsonOptionsInt());

                //禁止字符串被转义成Unicode
                options.JsonSerializerOptions.Encoder = JavaScriptEncoder.Create(UnicodeRanges.All);

            });


			
            //swagger 设置
            _services.AddSwaggerGen(c =>
            {
                //请求头参数输入框设置
                c.OperationFilter<OptionHeaderFilter>();

                //文档描述
                c.SwaggerDoc("v1", new OpenApiInfo
                {
                    Title = "service",
                    Version = "0.0.1",
                    Description = "文档描述"
                });

                //添加接口和实体的注释
                var path = AppContext.BaseDirectory;//Path.GetDirectoryName(typeof(Program).Assembly.Location);
                var api = Path.Combine(path, "api.xml");


                c.IncludeXmlComments(api, true);
                c.OrderActionsBy(o => o.RelativePath);
            });

			 //跨域设置
			 //var WithOrigins = AppSettings.ConfigItems["WithOrigins"]?.Split(";");//域名白名单
			 //允许跨域
			 _services.AddCors(policy =>
			 {
			
			     /*
			      * 可以在控制器处添加
			      * [EnableCors("CorsPolicy")]
			      */
			     policy.AddPolicy("CorsPolicy", opt => opt
			     .AllowAnyOrigin()
			     .AllowAnyHeader()
			     .AllowAnyMethod()
			     //#if !DEBUG
			     //                .WithOrigins(WithOrigins)//域名白名单
			     //#endif
			     .WithExposedHeaders("X-Pagination"));
			 });


            #region  请求大小设置
            builder.WebHost.UseKestrel(options =>
            {

                options.Limits.MaxRequestLineSize = int.MaxValue;//HTTP 请求行的最大允许大小。 默认为 8kb
                options.Limits.MaxRequestBufferSize = int.MaxValue;//请求缓冲区的最大大小。 默认为 1M

                //任何请求正文的最大允许大小(以字节为单位),默认 30,000,000 字节,大约为 28.6MB
                options.Limits.MaxRequestBodySize = int.MaxValue;//限制请求长度

            });

            /* ↓↓↓↓↓↓↓ 使用iis/nginx ↓↓↓↓↓↓ */
            _services.Configure<FormOptions>(x =>
            {
                x.ValueCountLimit = 1000000; // 设置表单键值对的最大数量
                x.ValueLengthLimit = int.MaxValue;// 设置表单数据长度限制为int的最大值
                x.MultipartBodyLengthLimit = int.MaxValue; // 设置多部分正文的长度限制为int的最大值
                //x.MultipartHeadersCountLimit = 100; // 设置多部分表单头的最大数量
                //x.MultipartHeadersLengthLimit = 16384; // 设置多部分表单头的最大长度(bytes)
            });
            #endregion

            return builder;


		}




        /// <summary>
        /// 注册服务
        /// </summary>
        public static void AddService()
        {
            //加载插件dll,否则GetAllAssembly()读取不到,可以实现简单的插件化,只在启动时读取一次,后续不影响性能
            //这里也可以放到 GetAllAssembly 方法的开头
            // Mods  插件文件夹
            var mods_dll = Directory.GetFiles("Mods", "*.dll");
            foreach (var mod in mods_dll)
            {
                Assembly.LoadFrom(mod);
            }


            var allAssembly = GetAllAssembly().Where(x => x.GetName().Name != "Microsoft.Data.SqlClient").ToList();

            //插件文件夹下面的dll
            var mods = allAssembly.Where(x => x.Location.Contains("\\Mods")).ToList();
            foreach (var item in mods)
            {
                // 添加插件的控制器,可以实现简单的插件化
                _mvc.AddApplicationPart(item);
            }

            #region 注入服务
            
            // 筛选继承了 ITransient 接口的类型
            var _transient = allAssembly.SelectMany(t => t.GetTypes()).Where(x => x.GetInterface("ITransient") != null).ToList();
            _transient.AddTransient();


            // 筛选继承了 IScoped 接口的类型
            var _scoped = allAssembly.SelectMany(t => t.GetTypes()).Where(x => x.GetInterface("IScoped") != null).ToList();
            _scoped.AddScoped();


            // 筛选继承了 ISingleton 接口的类型
            var _singleton = allAssembly.SelectMany(t => t.GetTypes()).Where(x => x.GetInterface("ISingleton") != null).ToList();
            _singleton.AddSingleton();
            #endregion
        }


        #region 注入服务方法
        /// <summary>
        /// 添加瞬时服务
        /// </summary>
        /// <param name="list"></param>
        public static void AddTransient(this List<Type> list)
        {
            foreach (var item in list)
            {
                _services.AddTransient(item);
            }
        }

        /// <summary>
        /// 添加请求范围服务
        /// </summary>
        /// <param name="list"></param>
        public static void AddScoped(this List<Type> list)
        {
            foreach (var item in list)
            {
                _services.AddScoped(item);
            }
        }

        /// <summary>
        /// 添加单列服务
        /// </summary>
        /// <param name="list"></param>
        public static void AddSingleton(this List<Type> list)
        {
            foreach (var item in list)
            {
                _services.AddSingleton(item);
            }
        }
        #endregion
        
        #region 注入服务方法
        /// <summary>
        /// 添加瞬时服务
        /// </summary>
        /// <param name="list"></param>
        public static void AddTransient(this List<Type> list)
        {
            foreach (var item in list)
            {
                _services.AddTransient(item);
            }
        }

        /// <summary>
        /// 添加请求范围服务
        /// </summary>
        /// <param name="list"></param>
        public static void AddScoped(this List<Type> list)
        {
            foreach (var item in list)
            {
                _services.AddScoped(item);
            }
        }

        /// <summary>
        /// 添加单列服务
        /// </summary>
        /// <param name="list"></param>
        public static void AddSingleton(this List<Type> list)
        {
            foreach (var item in list)
            {
                _services.AddSingleton(item);
            }
        }
        #endregion


        
        /// <summary>
        /// 获取全部 Assembly
        /// </summary>
        /// <returns></returns>
        private static List<Assembly> GetAllAssembly()
        {
            var allAssemblies = AppDomain.CurrentDomain.GetAssemblies().ToList();

            HashSet<string> loadedAssemblies = new();

            foreach (var item in allAssemblies)
            {
                loadedAssemblies.Add(item.FullName!);
            }

            Queue<Assembly> assembliesToCheck = new();
            assembliesToCheck.Enqueue(Assembly.GetEntryAssembly()!);

            while (assembliesToCheck.Any())
            {
                var assemblyToCheck = assembliesToCheck.Dequeue();
                foreach (var reference in assemblyToCheck!.GetReferencedAssemblies())
                {
                    if (!loadedAssemblies.Contains(reference.FullName))
                    {
                        try
                        {

                            var assembly = Assembly.Load(reference);

                            assembliesToCheck.Enqueue(assembly);

                            loadedAssemblies.Add(reference.FullName);

                            allAssemblies.Add(assembly);
                        }
                        catch (Exception ex)
                        {
                            Console.WriteLine(ex.Message);
                        }
                    }
                }
            }

            return allAssemblies;
        }



        /// <summary>
        /// app扩展
        /// </summary>
        /// <param name="app"></param>
        /// <returns></returns>
        public static WebApplication AppMain(this WebApplication app)
        {
            //全局允许跨域
            app.UseCors("CorsPolicy");
            app.UseStaticFiles();
            return app;
        }

	}

调用

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/514207.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2012年认证杯SPSSPRO杯数学建模D题(第一阶段)人机游戏中的数学模型全过程文档及程序

2012年认证杯SPSSPRO杯数学建模 减缓热岛效应 D题 人机游戏中的数学模型 原题再现&#xff1a; 计算机游戏在社会和生活中享有特殊地位。游戏设计者主要考虑易学性、趣味性和界面友好性。趣味性是本质吸引力&#xff0c;使玩游戏者百玩不厌。网络游戏一般考虑如何搭建安全可…

【leetcode】将x减到0的最小操作数/水果成篮/找到字符串中所有字母异位词{史上最容易懂的解析}

文章目录 1.将x减到0的最小操作数2.水果成篮3.找到字符串中所有字母异位词 1.将x减到0的最小操作数 分析题目 x不断地减去数组两端的值 看能否减到0&#xff1b;是不是就是在问&#xff1a;nums数组中存不存在【左端右端】组成的连续区间&#xff0c;区间上数的和为x 继续分析 …

EXCEL地理数据处理工具(地图任务)

版本号 作者 修订内容 发布日期 1.0 小O 更新至0705版 2022-4-28 1.1 小O 更新至0772版 2024年4月3日 一、概述 小O地图EXCEL插件版提供基于EXCEL表格进行地理数据处理、地图可视化、地图绘图等功能&#xff0c;地理工具是用户使用频率很高的功能模块。地理工具能…

hadoop:案例:将顾客在京东、淘宝、多点三家平台的消费金额汇总,然后先按京东消费额排序,再按淘宝消费额排序

一、原始消费数据buy.txt zhangsan 5676 2765 887 lisi 6754 3234 1232 wangwu 3214 6654 388 lisi 1123 4534 2121 zhangsan 982 3421 5566 zhangsan 1219 36 45二、实现思路&#xff1a;先通过一个MapReduce将顾客的消费金额进行汇总&#xff0c;再通过一个MapReduce来根据金…

easyExcel 模版导出 中间数据纵向延伸,并且对指定列进行合并

想要达到的效果 引入maven引用 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.2.1</version></dependency> 按照要求创建模版 备注 : 模板注意 用{} 来表示你要用的变量 如果本…

【Spring】使用@Bean和@Import注解配置Bean,与Bean的实例化

目录 1、bean是什么 2、配置bean 2.1、使用Bean注解配置Bean 2.2、使用Import注解配置Bean 3、实例化Bean 1、bean是什么 在 Spring 中&#xff0c;Bean 是指由 Spring 容器管理的对象。Spring IOC 容器负责创建、配置和管理这些 Bean 对象的生命周期。Spring IOC 容器会管…

网络基础二——传输层协议UDP与TCP

九、传输层协议 ​ 传输层协议有UDP协议、TCP协议等&#xff1b; ​ 两个远端机器通过使用"源IP"&#xff0c;“源端口号”&#xff0c;“目的IP”&#xff0c;“目的端口号”&#xff0c;"协议号"来标识一次通信&#xff1b; 9.1端口号的划分 ​ 0-10…

Spring Boot中前端通过请求接口下载后端存放的Excel模板

导出工具类 package com.yutu.garden.utils;import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import org.apache.commons.io.IOUtils; import org.apache.poi.hssf.util.HSSFColor; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.slf4j.Logger;…

06-编辑器

gedit编辑器 gedit是Ubuntu系统自带的编辑器&#xff0c;可以用来轻度编辑和记录一些内容。 在终端中我们通过以下命令打开&#xff1a; gedit 要打开或者新建的文件名虽然Ubuntu的图形界面也能通过gedit打开文件&#xff0c;但是用终端打开gedit可以动用更高的权限&#xff…

OpenHarmony实战开发-使用一次开发多端部署实现一多设置典型页面

介绍 本示例展示了设置应用的典型页面&#xff0c;其在小窗口和大窗口有不同的显示效果&#xff0c;体现一次开发、多端部署的能力。 1.本示例使用一次开发多端部署中介绍的自适应布局能力和响应式布局能力进行多设备&#xff08;或多窗口尺寸&#xff09;适配&#xff0c;保…

掌握机器学习新星:使用Python和Scikit-Learn进行图像识别

正文&#xff1a; 随着智能手机和社交媒体的普及&#xff0c;图像数据的生成速度比以往任何时候都快。为了自动化处理这些数据&#xff0c;我们需要强大的图像识别系统。机器学习提供了一种有效的方法来识别和分类图像中的对象。Scikit-Learn是一个流行的Python库&#xff0c;它…

谷粒商城实战(010 缓存-解决数据一致性问题以及SpringCache的使用)

Java项目《谷粒商城》架构师级Java项目实战&#xff0c;对标阿里P6-P7&#xff0c;全网最强 总时长 104:45:00 共408P 此文章包含第166p-第p172的内容 缓存一致性问题解决 redisson使用lua脚本&#xff0c;所以的锁都保证了原子性 改之前的代码 锁的粒度越小越好 如11号…

PS入门|黑白色的图标怎么抠成透明背景

前言 抠图可以算是PS的入门必备操作&#xff0c;开始学习PS的小伙伴可以根据本帖子推荐一步步学习哦&#xff01;但切勿心急&#xff5e; 今天给小伙伴们带来&#xff1a;黑白色的图标抠图教程 抠图有很多种方法&#xff0c;但根据类型的不同&#xff0c;使用适当的方法很重…

Redis底层数据结构-Dict

1. Dict基本结构 Redis的键与值的映射关系是通过Dict来实现的。 Dict是由三部分组成&#xff0c;分别是哈希表&#xff08;DictHashTable&#xff09;&#xff0c;哈希节点&#xff08;DictEntry&#xff09;&#xff0c;字典&#xff08;Dict&#xff09; 哈希表结构如下图所…

YUNBEE云贝-2024年4月PostgreSQL PGCM认证实战培训

课程介绍 了解关注开源技术&#xff0c;学习PG以点带面 Linux/Andriod&#xff08;操作系统&#xff09;、Apache/Tomcat&#xff08;应用服务器&#xff09;、OpenStack/KVM&#xff08;虚拟化&#xff09;、Docker/K8S&#xff08;容器化&#xff09;、Hadoop&#xff08;大…

利用Python和Selenium实现定时任务爬虫

网络爬虫在信息获取、数据分析等领域发挥着重要作用&#xff0c;而定时爬虫则可以实现定期获取网站数据的功能&#xff0c;为用户提供持续更新的信息。在Python中&#xff0c;结合Selenium技术可以实现定时爬虫的功能&#xff0c;但如何设置和优化定时爬虫的执行时间是一个关键…

C语言编写Linux的Shell外壳

目录 一、输出命令行 1.1 了解环境变量 1.2 获取用户名、主机名、当前路径 1.3 缓冲区改进MakeCommandLine 二、获取用户命令 2.1 读取函数的选择 2.2 细节优化 2.3 返回值 三、指令和选项分割 3.1 strtok 函数 3.2 分割实现 四、执行命令 4.1 fork 方法 4.2 进…

Qt C++ | Qt 元对象系统、信号和槽及事件(第一集)

01 元对象系统 一、元对象系统基本概念 1、Qt 的元对象系统提供的功能有:对象间通信的信号和槽机制、运行时类型信息和动态属性系统等。 2、元对象系统是 Qt 对原有的 C++进行的一些扩展,主要是为实现信号和槽机制而引入的, 信号和槽机制是 Qt 的核心特征。 3、要使用元…

蓝桥杯嵌入式学习笔记(9):RTC程序设计

目录 前言 1. RTC介绍 2. 使用CubeMx进行源工程配置 3. 代码编程 3.1 准备工作 3.2 进行bsp_rtc.h编写 3.3 进行bsp_rtc.c编写 3.4 main.c编写 3.4.1 头文件引用 3.4.2 变量声明 3.4.3 子函数声明 3.4.4 函数实现 3.4.5 main函数编写 4. 代码实验 5. 总结 前言 因本人备赛蓝…

2024年购买阿里云服务器多少钱?100元-5000元预算

2024年阿里云服务器租用费用&#xff0c;云服务器ECS经济型e实例2核2G、3M固定带宽99元一年&#xff0c;轻量应用服务器2核2G3M带宽轻量服务器一年61元&#xff0c;ECS u1服务器2核4G5M固定带宽199元一年&#xff0c;2核4G4M带宽轻量服务器一年165元12个月&#xff0c;2核4G服务…