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

news2024/11/20 3:29:58

.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;
        }

	}

调用

在这里插入图片描述

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

部署k8s客户端,及docker私仓部署

1.部署一个docker私仓 mkdir /opt/docker/registry #配置仓库密码 mkdir /opt/docker/auth cd /opt/docker/auth htpasswd -Bbn admin admin > htpasswd#运行docker私仓服务&#xff0c;下面端口5000:5000 前面的5000对应本机端口可以自定义 docker run -itd \ -v /opt/d…

Django複習總結

①Django是框架。那麼什麼是框架&#xff1a; 框架很像是一個骨架&#xff0c;帶有很多默認器官的骨架。我們可以根據需要改寫、複寫這些器官。 從而實現自己所需要的功能。 ②Django是MVC模型\MVT模型&#xff1a; MVC模型&#xff1a;M&#xff1a;models模型層 V&#…

redis开源协议变更了?我们还能用吗?

Redis是一款广泛使用的开源键值存储数据库&#xff0c;其开源协议的变更引起了社区和行业的广泛关注。根据搜索结果&#xff0c;Redis Labs宣布Redis将采用双重源代码可用许可证&#xff08;RSALv2&#xff09;和服务器端公共许可证&#xff08;SSPLv1&#xff09;&#xff0c;…

HTML - 你是如何理解link和@import的

难度级别:初级及以上 提问概率:55% link是我们非常熟悉的一个HTML标签,用于引入CSS文件,而@import则存在于CSS文件内部,用于再次引入其他的CSS文件。所以很显然,执行顺序上,link标签会随着HTML文档加载,开始触发下载CSS文件的操作。…

tomcat-连接器架构设计

一、NioEndpoint组件 Tomcat的NioEndPoint组件实现了I/O多路复用模型&#xff0c;接下来我会介绍NioEndpoint的实现原理。 1.总体工作流程 我们知道&#xff0c;对于Java的多路复用器的使用&#xff0c;无非是两步&#xff1a; 1.创建一个Seletor&#xff0c;在它身上注册各…

Spring MVC 的执行流程

Spring MVC 的执行流程 1、用户输入 URL 或 点击链接&#xff0c;浏览器将发送 HTTP 请求到服务器 2、请求首先到达 Spring MVC 的前端控制器 DispatcherServlet 3、前端控制器通过处理器映射器 HandlerMapping 根据请求 URL 找到对应的处理器 handler 4、前端控制器使用处理…

三星、SK hynix和美光三大厂商DRAM单片晶圆容量趋势

随着DRAM单元尺寸的不断缩小&#xff08;也就是制程微缩&#xff09;&#xff0c;晶圆级&#xff08;12英寸&#xff09;DRAM的最大容量持续增加。 特别值得一提的是&#xff0c;美光最近推出的D1-beta 16 Gb DDR5芯片&#xff0c;使得每片晶圆的最高容量达到了3.61 TB&#xf…

【前端】HTML(常用的HTML标签)

文章目录 HTML一、什么是HTML1.快速生成代码 二、HTML标签0.注释1.标题2.段落3.换行4.格式化标签5.图片标签&#xff1a;img目录结构 6.超链接标签&#xff1a;a7.表格标签复制快捷键&#xff1a;shiftalt↓单元格合并 8.列表标签1.无序列表2.有序列表3.自定义列表 9.表单标签1…

5.5G,只比6G少0.5G

5.5G成为通信行业2024年开年的一大焦点。提到5.5G&#xff0c;多出来的0.5G又是啥&#xff1f;为什么不直接迈向6G时代&#xff1f;今天我们一探究竟&#xff01; “0.5G”&#xff0c;现在与未来的桥梁 2021年&#xff0c;国际标准组织3GPP为通信技术的进一步发展定义了新的里…

hive 慢sql 查询

hive 慢sql 查询 查找 hive 执行日志存储路径&#xff08;一般是 hive-audit.log &#xff09; 比如&#xff1a;/var/log/Bigdata/audit/hive/hiveserver/hive-audit.log 解析日志 获取 执行时间 执行 OperationId 执行人 UserNameroot 执行sql 数据分隔符为 \001 并写入 hiv…

docker------docker入门

&#x1f388;个人主页&#xff1a;靓仔很忙i &#x1f4bb;B 站主页&#xff1a;&#x1f449;B站&#x1f448; &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;Linux &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#…

CSS3 实现文本与图片横向无限滚动动画

文章目录 1. 实现效果2.html结构3. css代码 1. 实现效果 gif录屏比较卡&#xff0c;实际很湿滑&#xff0c;因为是css动画实现的 2.html结构 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"…

Rust---复合数据类型之字符串与切片(2)

目录 字符串操作删除 (Delete)连接 (Concatenate) 字符串转义 前情回顾: Rust—复合数据类型之字符串&#xff08;1&#xff09; 字符串操作 删除 (Delete) 删除方法仅适用于 String 类型&#xff0c;分别是&#xff1a; pop()&#xff0c;remove()&#xff0c;truncate()&a…

如何利用Flutter将应用成功上架至iOS平台:详细指南

引言 &#x1f680; Flutter作为一种跨平台的移动应用程序开发框架&#xff0c;为开发者提供了便利&#xff0c;使他们能够通过单一的代码库构建出高性能、高保真度的应用程序&#xff0c;同时支持Android和iOS两个平台。然而&#xff0c;完成Flutter应用程序的开发只是第一步…

Vue和FastAPI实现前后端分离

前言 近期接触了一些开源大模型应用服务&#xff0c;发现很多用的都是FastAPI web框架&#xff0c;于是乎研究了一下它的优势&#xff0c;印象最深有两个&#xff1a;一个是它的异步处理性能比较好&#xff0c;二是它可以类似java swagger的API交互文档&#xff0c;这个对应前…

利用sqoop实现sql表数据导入到Hadoop

1.在开发这创建好sql表后&#xff0c;开始执行下面步骤 2.sqoop的安装路径&#xff0c;我这里放在以下位置 3. 进入到option2脚本中&#xff0c;下面是脚本里的内容 下面四点要根据情况随时更改&#xff1a; 1>jdbc:mysql://node00:3306/数据库名 2>sid,sname->前…

Vue项目中 安装及使用Sass(scss)

普通方法 一、安装使用scss 1. 安装 scss npm install scss --save2. 安装 node-sass 和 sass-loader sass-loader&#xff1a;把 sass编译成css node-sass&#xff1a;nodejs环境中将sass转css 提示&#xff1a;限制 node-sass&#xff0c;sass-loader 版本号&#xff0c;…

如何处理Flutter内存泄漏检测和优化

处理Flutter内存泄漏问题是构建高性能、稳定的应用程序的关键部分之一。在本文中&#xff0c;我将详细介绍如何检测和优化Flutter内存泄漏问题&#xff0c;以确保应用程序的良好性能和用户体验。 1. 了解内存泄漏 在深入了解如何处理Flutter内存泄漏之前&#xff0c;首先需要了…

DDL ---- 数据库的操作

1.查询所有数据库 show databases; 上图除了自创的&#xff0c;其他的四个都是mysql自带的数据库 。&#xff08;不区分大小写&#xff09; 2.查询当前数据库 select database(); 最开始没有使用数据库&#xff0c;那么查找结果为NULL 所以我们就需要先使用数据库&#xff…

C++基础13:C++输入输出

此专栏为移动机器人知识体系下的编程语言中的 C {\rm C} C从入门到深入的专栏&#xff0c;参考书籍&#xff1a;《深入浅出 C {\rm C} C》(马晓锐)和《从 C {\rm C} C到 C {\rm C} C精通面向对象编程》(曾凡锋等)。 12.C输入/输出 12.1 C流类 计算机的输入和输出是数据传送的过…