• .Net Core 学习之路-基础


    .Net Core出来好久了,一直在了解,但始终没有应用到实际项目中....

    准备用.net core搞个SSO,才发现它和.net framework的变化并不是一点点...

    .net core还在学习摸索中,这篇文章就遇到的问题记录一下,希望对需要的人有所帮助

    环境变量

    .Net Core包含一个launchSettings.json的文件,在项目的Properties"文件夹下

    本地计算机开发环境中,这个文件设置了.net core不同运行环境中每个变量的值

    在生产环境中,设置环境的方法取决于操作系统而不是此文件了

    我们可以通过配置环境变量启用或禁用应用程序部分功能

    在Startup.cs 的 Configure函数中可通过IHostingEnvironment来获取当前环境变量的配置

    配置项读写

    WebHost.CreateDefaultBuilder(args) 这段代码会加载默认配置项,同时也可能启用部分服务

    加载顺序为:

    • appsettings.json。
    • appsettings.{Environment}.json。
    • 应用在 Development 环境中运行时的用户机密。(secrets.json)
    • 环境变量。(launchSettings.json)
    • 命令行参数。

    读取配置项

    以下面的appsettings设置为例:

    {
      "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Warning"
    }
      },
      "App": {
    "ConnectionStrings": {
      "RwViewSQLConnString": "server=*;Initial Catalog=*;Persist Security Info=True;User ID=sa;Password=123456;Connect Timeout=300;",
      "RoViewSQLConnString": "server=*;Initial Catalog=*;Persist Security Info=True;User ID=sa;Password=123456;Connect Timeout=300;"
    },
    "AppSettings": {
      "SqlHelperNonQueryCommandTimeout": 30,
      "SqlHelperQueryCommandTimeout": 30
    }
      }
    }
    

    读取单个节点: Configuration.GetSection("App:ConnectionStrings:RwViewSQLConnString")

    将节点绑定到实体数据模型: Configuration.GetSection("App").Bind(new ConfigOptions());

    在类库中获取IConfiguration

     var builder = new ConfigurationBuilder()
    .SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
    ApplicationEnvironment env = PlatformServices.Default.Application;
    IConfiguration Configuration = builder.Build();
    

    也可以用ioc的注入从构造函数中获取,不过着实不方便,更建议建一个静态类来保存全局配置

    可以监听配置文件的改变事件来重新绑定实体模型:

     Configuration.GetReloadToken().RegisterChangeCallback(OnSettingChanged, Configuration);
    
     public void OnSettingChanged(object state)
        {
            callbackRegistration?.Dispose();
            IConfiguration configuration = (IConfiguration)state;
            configuration.GetSection("App").Bind(new ConfigOptions());
            callbackRegistration = configuration.GetReloadToken()
               .RegisterChangeCallback(OnSettingChanged, state);
        }
    

    按环境配置

    我们可以通过设置 launchSettings.json文件中对应启动方式的ASPNETCORE_ENVIRONMENT值来设定程序的运行环境,官方只支持三个固定的值:Development、Staging 或 Production

    appsettings.json会优先读取appsettings.{Environment}.json中设定的值

    用户机密

    按照我们以往的习惯,可能习惯于将之前存在web.config中的配置项转移到 appsettings.json 中存储,但是对于数据库连接字符串等加密信息如今.net core不太建议我们通过这种方式来存储

    开发环境中它提供了另一种存储方式:机密管理器

    实际上是将密码的配置存储到本地电脑的一个json文件当中,这个文件存储的位置与操作系统和服务器的登陆用户有关。

    这种做法的好处总结为下两点:

    • 将机密文件与项目源代码分离,提高安全性
    • 以连接字符串为例,如果多人开发的情况,每个人可能用到的链接不同,避免的多人都在更改同一个配置文件,上传时还要还原的繁琐

    下面介绍下机密管理器的使用方式:

    安装nuget包:

    • Microsoft.Extensions.Configuration.UserSecrets
    • Microsoft.VisualStudio.Web.CodeGeneration.Tools

    第一个包用于配置机密文件 第二个用于读取配置

    此时查看项目的工程文件(*.csproj),可以看到多出来一个UserSecretsId节点的配置,类似于下面这样:

    <UserSecretsId>79bbf988-8542-4789-a63e-d4a3588c64a3</UserSecretsId>
    

    在vs中我们可以右键项目->Manage User Secrets 编辑机密文件:

    {
      "App": {
    "ConnectionStrings": {
      "RwViewSQLConnString": "server=*;Initial Catalog=*;Persist Security Info=True;User ID=sa;Password=123456;Connect Timeout=300;",
      "RoViewSQLConnString": "server=*;Initial Catalog=*;Persist Security Info=True;User ID=sa;Password=123456;Connect Timeout=300;"
    },
    "AppSettings": {
      "SqlHelperNonQueryCommandTimeout": 40,
      "SqlHelperQueryCommandTimeout": 40
    }
      }
    }
    

    我们再一次读取 configuration.GetSection("App").Bind(new ConfigOptions()); 中的配置项就会以 User Secrets中的配置为准

    这种机密文件的配置方式只适用于开发环境,让密码配置脱离源代码管理器。生产环境中我们则需要 生产机密Microsoft Azure 密钥保管库配置

    密钥保管库暂时没有进行研究,留到后面研究清楚之后会单独写一篇文章

    服务器 URL

    可通过 UseUrls函数设置url

    或者通过配置文件配置 hostting.json文件内容:

    {
    urls: "http://*:5005"
    }

    配置启用方式

     public static IWebHost BuildWebHost(string[] args)
    {
    var config = new ConfigurationBuilder()
    .SetBasePath(Directory.GetCurrentDirectory())
    .AddJsonFile("hosting.json", optional: true)
    .AddCommandLine(args)
    .Build();
    
    return WebHost.CreateDefaultBuilder(args)
    .UseUrls("http://*:5000;http://*:5001;")
    .UseConfiguration(config)
    .UseStartup<Startup>()
    .Build();
    }
    

    若无hostting.json配置,以上代码将会监听两个端口:5000 5001

    若存在配置则会用5005端口

    参考链接:https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/hosting?tabs=aspnetcore2x#overriding-configuration

    过滤器

    .net Core中过滤器的用法没有太大的改变,注册全局过滤器的方式有所不同:

      services.AddMvc(options=> {
    options.Filters.Add(typeof(SampleActionFilterAttribute));
    });
    

    过滤器和.net core的中间件似乎很是相似,但是相比之下,过滤器可以处理到更细节的地方,相比中间件更加灵活

    日志

    之前一直用Log4net来记录日志,.net core2.0默认提供的日志记录方式并不能满足生产环境的要求,所以研究了下log4net在.net core中的用法:

    • 引用最新版的nuget包
    • 增加配置文件log4net.config

    使用代码如下:

    log4net.Repository.ILoggerRepository repository = log4net.LogManager.CreateRepository("NETCoreRepository");
    var fileInfo = new FileInfo("log4net.config");
    log4net.Config.XmlConfigurator.Configure(repository, fileInfo);
    log4net.Config.BasicConfigurator.Configure(repository);
    log4net.ILog log = log4net.LogManager.GetLogger(Startup.Repository.Name, MethodBase.GetCurrentMethod().DeclaringType);
    

    repository的位置可以放在startup当中,避免每次都实例化

    同时研究了下官方推荐的一个第三方日志记录提供程序Nlog

    Nlog在.net core的详细使用说明可参考官网:https://github.com/NLog/NLog.Web/wiki/Getting-started-with-ASP.NET-Core-2

    我这里就直接贴代码了:

    首先需要引用最新的nuget包:NLog.Web.AspNetCore NLog.Extensions.Logging

    配置文件nlog.config:

    <?xml version="1.0" encoding="utf-8" ?>
    <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      autoReload="true"
      internalLogLevel="Debug"
      internalLogFile="internal-nlog.txt">
    
      <!--define various log targets-->
      <targets>
    <!--保存至文件-->
    <target name="log_file" xsi:type="File"
    fileName="../../../NLogs/${shortdate}_${level:uppercase=false:padding=-5}.log"
    layout="${longdate} | ${message} ${onexception:${exception:format=tostring} ${newline} ${stacktrace} ${newline}" />
      </targets>
    
      <rules>
    <logger name="*" level="Info" writeTo="log_file" />
    <logger name="*" levels="Error" writeTo="log_file" />
    <logger name="*" levels="Debug" writeTo="log_file" />
    <logger name="*" level="Fatal" writeTo="log_file" />
    <logger name="*" level="Warn" writeTo="log_file" />
      </rules>
    </nlog>
    

    startup:

    public void Configure(IApplicationBuilder app, IHostingEnvironment env,
    ILoggerFactory loggerFactory)
        {
            loggerFactory.AddNLog();
            app.AddNLogWeb();
            env.ConfigureNLog("nlog.config");
    	}
    

    controller:

     private NLog.Logger nLogger = NLog.LogManager.GetCurrentClassLogger();
        private readonly ILogger<HomeController> nLogger2;
        public HomeController(IOptions<AppSettionsOptions> set, ILogger<HomeController> logger2)
        {
            nLogger2 = logger2;
        }
        public IActionResult Index()
        {
            nLogger.Info("nloginfo");
            nLogger.Error("nlogerror", new Exception("自定义异常"));
            nLogger2.LogInformation("nloginfo2");
            nLogger2.LogError("nlogerror2", new Exception("自定义异常"));
    
            return View();
        }
    

    上面展示了两种logger的调用方式

    值得注意的是通过构造函数注入的logger对象会优先选择appsettings.json中的配置

    更要注意的是appsetting取的是配置的环境变量所对应的appsettings.{Environment}.json。(之前调试过程中我将环境变量改了,结果在测试日志输出时发现appsettings怎么设置都没用...)

    IOC

    .net Core 内置了一套默认的依赖注入实现,但并不是太好用

    官网提供了一个Autofac的简单示例,之前对Antofac也只是初步了解了一下,没有深入使用

    下一篇将详细讲解下.Net core中Ioc的使用

  • 相关阅读:
    【转帖】流程与IT管理部——IT支撑业务变革的必然趋势
    【转帖】39个让你受益的HTML5教程
    【转帖】2015年2月份最佳的免费 UI 工具包
    【消息】Pivotal Pivots 开源大数据处理的核心组件
    【转帖】创业者,你为什么这么着急?
    教程:SpagoBI开源商业智能之XML Template 图表模板
    教程:Spagobi开源BI系统 Console报表设计教程
    【转帖】Mysql多维数据仓库指南 第一篇 第1章
    Kiss MySQL goodbye for development and say hello to HSQLDB
    梯度消失和梯度爆炸问题详解
  • 原文地址:https://www.cnblogs.com/bluesummer/p/8862754.html
Copyright © 2020-2023  润新知