Skip to content

NET Core

约 1496 字大约 5 分钟

coreNET

2024-03-16

跨平台、跨架构、支持命令行、灵活部署、开源

体积更小,启动速度更快,占用资源更少

  • 管道是什么?
    • app.use(): 有next可以交给下一个管道
    • app.run():终端短路管道

对请求做处理 响应请求 。在任意位置插入新的逻辑 而不影响原有逻辑 AOP?

初始常见问题

  • 静态资源跨域处理
    • 注意UseStaticFiles()是否重复调用
      app.UseStaticFiles(new StaticFileOptions
            {
                OnPrepareResponse = (c) =>
                {
                    c.Context.Response.Headers.Add("Access-Control-Allow-Origin", "*");
                }
            });
- 运行没有样式
   - 拷贝wwwroot文件 ,startup中使用usestaticfiles
   - 还原nuget  `dotnet restore`

静态文件

  • libman 类似 nuget 的工具
  • bundle 捆绑压缩前端的cssjs文件 需要nuget下载 并添加配置文件

发布

配置文件

  • 引入配置文件包 Microsoft.Extensions.Hosting 包含了所有的东东,什么Microsoft.Extensions.Configuration啊,Microsoft.Extensions.Configuration.FileExtensions啊,Microsoft.Extensions.Configuration.Json啊
  var configuration = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory()) // 读取配置文件的基础目录,绝对路径
                //optional:文件不存在不会异常,reloadOnChange:文件改变后重载配置
                .AddJsonFile("appsettings.json",path, optional: true, reloadOnChange: true) 
                .Build();
            services.AddSingleton<IConfiguration>(configuration);
            services.AddSqlSugar(configuration);
            return this;

/// 配置扫描配置文件
private static IConfiguration BuildConfig()
{
     var configurationBuilder = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())//Microsoft.Extensions.Configuration.FileExtensions.
            .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);//Microsoft.Extensions.Configuration.FileExtensions.json
     var configuration = configurationBuilder.Build();

     var scanDirs = configuration.GetConfig<string[]>("ConfigurationScanDirectories");
     if (scanDirs == null) throw new Exception("配置文件节点未找到");
     foreach (string dir in scanDirs)
     {
         string dirPath = Path.Combine(Directory.GetCurrentDirectory(), dir);
         if (Directory.Exists(dirPath))
         {
             var files = Directory.GetFiles(dirPath, "*.json");
             foreach (var file in files) configurationBuilder.AddJsonFile(file, optional: true, reloadOnChange: true);
         }
     }
     configuration = configurationBuilder.Build();
     return configuration;
}

IConfiguration

IConfiguration 本身是一个高层抽象接口,它不直接读取文件。真正执行底层 I/O 操作(如打开文件、读取字节流、解析内容)的是各个具体的 IConfigurationProvider 实现类(例如 JsonConfigurationProvider)。而 ConfigurationRoot 的作用是聚合多个 Provider 的结果,并提供统一的访问入口

部署

  • 部署类型

    • 依赖框架部署(FDD)

    包含自己的代码以及第三方依赖 包含dll文件

    优点 不必预先定义应用运行的目标操作系统,生成的是可执行文件以及库是通用的,部署包很小

    缺点 依赖目标系统的 .NET Core版本

    • 独立部署(SCD)

    部署到指定系统 包含.exe dll文件

    优点 不依赖目标系统.NET Core版本 独立

    缺点 续指定目标系统发布 包大

    • 依赖框架的可执行文件(FDE)
  • IIS

需要发布之后生成的web.config文件才能在iis上运行

进程内:

​ 配置文件里的hostingModel属性 改为inprocess 推荐进程内, 效率高于进程外

进程外:

​ hostingModel属性 改为outofprocess iis就只做转发,转发到kestrel

dotnet KnowLedge.dll --urls="http://*:8848" --ip="127.0.0.1" --port=8848

  • kestrel

kestrel 速度快但是功能弱 一般采用kestrel结合nginx或者iis

  • Docker
    • 有linux、windows容器

在项目中添加docker的支持 docker配置文件

# 基础阶段

# 构建阶段

# 发布阶段

# 最终截断

构建镜像

docker images # 查看镜像

docker run --name=adsfa -p 5000:80 -d 镜像名称

生命周期

  • AddTransient: 瞬时生命周期 每次从服务实例里请求时,都创建一个新的对象
  • AddSingleton:单例 每次使用同一个单实例 全程唯一 。适用于配置文件、连接池
  • AddScoped:作用域 同一个线程(请求)里 只实例一次 容器单例

AOP

  • Filter

    一般控制MVC流程内的事 关于aciton controller中的事 具体的某个请求

    • IActionFilter

    • IResourceFilter:资源管理过滤器

      • 一般用作缓存 因为他发生在控制器实例化之前,这个时候缓存更加节约资源 不用过多请求
    • IResultFilter

  • 中间件

    在中间件中实现的 比如反扒,防盗链 还没到业务层面

  • AutoFac

    针对action 之类的业务类型做扩展

  • Casstle

    • 用于扩展AOP(类(需要virtual标记)、接口(所有方法)) 原理适配器的代理模式
      • nuget castle.Core
      • 三个对象
        • proxyGenerator--Castle提供的动态代理对象
        • 注入对象 需要实现StandardInterceptor
        • 原始对象
    • 可以用特性注入 更加灵活

缓存

  • ResponseCache:前端缓存

    属性

    • Duration:缓存时间
  • 缓存问题解决

    • 缓存穿透:利用不存在的数据 进行查询 穿透缓存 解决:可以把null存下来或者根据业务来指定规则
    • 缓存击穿:在某个值过期时 大量数据涌入造成,解决:更新缓存,不过期 重写回收方法
    • 缓存雪崩:大量key同时过期,数据库压力增大,解决:均衡分配数据,随机过期时间,不过期 只更新

IOC

  • IOC与依赖注入的区别
    • IOC是一种设计模式,依赖注入是实现IOC的方式。依赖注入是实现抽象一个对象依赖的对象还需要注入
  • 在.NET Core的依赖注入中,通常情况下,如果一个类的构造函数中注入了容器中已注册的服务,那么这个类本身也会成为容器管理的服务,即它也可以被注入到其他类中。

GRPC

  • 简单RPC: 跟普通API相同 一问一答式

  • 服务端流式:一次请求多次返回,没有并发限制

  • 客户端流式:多次请求一次返回

  • GRPC 和 WCF的区别

    • wcf 一次请求一次应答,数据包返回 适合做即时通讯。冗余 性能差 IIS MQ TCP
    • grpc: tcp 高性能 跨语言
    • webapi:http1.1 跨语言 调用麻烦 压缩率低

Castle

  • autofac 基于castle实现的

  • 需要三个对象(动态代理对象、注入对象、原始对象)

  • 注入类型

    • 类型注入(CreateClassProxy(),只对virtual方法生效)

      • 原始对象需要aop的方法必须是虚方法
      • 因为普通方法在类实例化时已经确定了生成,虚方法可以在生成时去重写 覆盖他 所以方便做到aop
    • 接口注入(CreateInterfaceProxyWithTarget(),全部方法都会生效)

      • 可以使用特性扩展,指定不同特性 调用不同的方法