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

本文详细介绍了如何在.NETCore、.NET6和.NET8中配置启动类Program.cs,涉及服务集合、MVC构建、HTTP组件、AppSettings、Cookie管理、全局过滤器、JSON选项、Swagger生成、跨域设置以及请求大小限制等内容。
摘要由CSDN通过智能技术生成

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

	}

调用

在这里插入图片描述

在这里插入图片描述

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
.NET Core 应用程序中,可以通过修改 `Program.cs` 文件来设置启动程序。具体步骤如下: 1. 打开 `Program.cs` 文件,找到 `Main` 函数。 2. 在 `Main` 函数中,创建一个 `HostBuilder` 对象,并调用 `ConfigureWebHostDefaults` 方法来配置 Web 主机。例如: ```csharp public static void Main(string[] args) { var hostBuilder = Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); }) .Build(); hostBuilder.Run(); } ``` 在上面的代码中,我们调用了 `Host.CreateDefaultBuilder` 方法来创建一个默认的 `HostBuilder` 对象,然后调用了 `ConfigureWebHostDefaults` 方法来配置 Web 主机。`UseStartup` 方法指定了启动时要使用的 `Startup` 类型。最后,我们通过 `Build` 方法创建了主机对象,并调用了 `Run` 方法来启动应用程序。 如果你想要配置控制台主机,可以调用 `ConfigureConsoleHost` 方法来配置控制台主机,例如: ```csharp public static void Main(string[] args) { var hostBuilder = Host.CreateDefaultBuilder(args) .ConfigureConsoleHost(options => { options.SuppressStatusMessages = true; }) .ConfigureServices((hostContext, services) => { // 配置服务 }) .Build(); hostBuilder.Run(); } ``` 在上面的代码中,我们调用了 `ConfigureConsoleHost` 方法来配置控制台主机,并设置了 `SuppressStatusMessages` 属性为 `true` 来禁止输出状态消息。然后调用了 `ConfigureServices` 方法来配置应用程序所需的服务。最后,我们通过 `Build` 方法创建了主机对象,并调用了 `Run` 方法来启动应用程序。 需要注意的是,这里只是演示了如何设置启动程序,具体的配置和代码实现可能会因为应用程序类型、需求和场景而不同。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_42199478

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值