精华内容
下载资源
问答
  • t contain <code>Microsoft.NETCore.App.versions.txt</code>. Is it expected? How can I get corresponding commit hash? <p>Thank you!</p><p>该提问来源于开源项目:dotnet/runtime</p></div>
  • at Rotativa.NetCore.WkhtmltopdfDriver.Convert(String wkhtmltopdfPath, String switches) in /Users/codeflow/Downloads/Rotativa.NetCore-master/Rotativa.NetCore/WkhtmltopdfDriver.cs:line 27 at Rotativa....
  • 随着.NetCore版本发布变更,在最近一年左右开始接触到.NetCore,之前只是传闻,并没有动手实操;.NetCore逐渐成熟,大大小小的公司也开始进行使用,感觉再不学习就落后了,于是乎搜索各种资料开始学习,学习路径是...

    随着.NetCore版本发布变更,在最近一年左右开始接触到.NetCore,之前只是传闻,并没有动手实操;.NetCore逐渐成熟,大大小小的公司也开始进行使用,感觉再不学习就落后了,于是乎搜索各种资料开始学习,学习路径是通过官网、博客、视频;总的来说,项目开发应该没有问题,但是总觉得所学知识不够体系,总是停留在会用阶段,对于相关联知识也不熟,从而导致好多零碎的知识点每次都只能通过搜索引擎解决,浪费了不少时间,而且对于微服务体系的架构也需要有扎实的知识,所以痛定思痛,从头整理,将知识点形成体系。初篇先从概述和简单使用开始;

    .NetCore百度百科定义

    .NET Core是适用于 Windows、Linux 和 macOS 的免费、开源托管的计算机软件框架,是微软开发的第一个官方版本,具有跨平台能力的应用程序开发框架 (Application Framework);

    .NetCore应用场景,如下图:

    f2bd5ff763bf8d09181a18c70017c0b0.png

    官方说明,.NetCore在桌面程序、Web、云、移动、游戏、物联网、AI领域都能进行开发。对于我自己而言,Web程序和控制台程序开发的比较多,随着后续版本的发布迭代,Winform/WPF桌面应用程序应该也是不错的选择,毕竟界面开发的便捷性是很大的优势,但个人觉得像桌面程序后续做工具、单机项目及内部小项目会使用,大型项目应该采取Web架构更加适合(个人理解);

    .NetCore版本发布

    时间版本备注
    2016年2月.Net Core 1.0 RC1
    2016年5月.Net Core 1.0 RC2
    2016年6月.Net Core 1.0 
    2017年3月.Net Core 1.1 
    2017年8月.Net Core 2.0 
    2018年5月.Net Core 2.1(LTS)长期支持版本
    2018年12月.Net Core 2.2 
    2019年9月.Net Core 3.0(Maintenance) 
    2019年12月.Net Core 3.1(LTS)长期支持版本
    2020年11月.NET5.0
    2021年11月.NET6.0(LTS)长期支持版本
    2022年11月.NET7.0
    2023年11月.NET8.0(LTS)长期支持版本

    根据以上表格体现,其实微软在很早之前就开始做.NetCore进行布局了,从2016年开始发布对应版,起初迭代还是相对比较快的;其中LTS版本是长期支持版本,相对比较推荐; 目前3.1是推荐使用版本,后续微软计划每一年发布一个版本,其中偶数版本为LTS版本;

    后续版本为什么直接到NET5.0(非官方定义)

    从NET5.0版本开始,将不再区分.NetFrameWork和.NetCore,统一叫.NET,之前之所以叫.NetCore,应该就是为了区分两个版本;至于为什么版本直接从3.0到5.0,因为现在.NetFrameWork是4.8了,由于后续是兼容版本,如果再起4.x版本的话就会感觉冲突,所以直接到5.0;(哈哈哈,这样理解其实挺合理);

    开发工具

    微软提供了几款开发工具,适应于各平台的开发,如下图:

    03f7d3712943b1b293ccabd036e3d61d.png

    可以根据自己环境选择不同的开发工具;

    HelloWorld走起

    如果在Windows安装的是VisaulStudio的话,在安装过程中就安装了SDK,如果用Visual Studio Code,那么需要单独安装对应的SDK;这里默认都安装好了;

    1. 打开开发工具,创建新项目;

    0b5578140a0b9dd527827f49626dd5d3.png

    2. 搜索控制台,选择第一个;

    33c3d7c9531f6f5a37389ca4a100c679.png

    3. 项目命名,选择对应文件夹;

    e05edf17071e86f91ae3caaa77aa5cf3.png

    4. 点击创建,生成项目,然后直接运行;

    5eacb9a275a73f2be399ac93f3502a19.png

    总结    概述就这么多吧,如果需要详细了解,去官网或搜索引擎去详看;下一篇简述Asp.NetCore的启动过程;
    展开全文
  • 随着.NetCore版本发布变更,在最近一年左右开始接触到.NetCore,之前只是传闻,并没有动手实操;.NetCore逐渐成熟,大大小小的公司也开始进行使用,感觉再不学习就落后了,于...

    随着.NetCore版本发布变更,在最近一年左右开始接触到.NetCore,之前只是传闻,并没有动手实操;.NetCore逐渐成熟,大大小小的公司也开始进行使用,感觉再不学习就落后了,于是乎搜索各种资料开始学习,学习路径是通过官网、博客、视频;总的来说,项目开发应该没有问题,但是总觉得所学知识不够体系,总是停留在会用阶段,对于相关联知识也不熟,从而导致好多零碎的知识点每次都只能通过搜索引擎解决,浪费了不少时间,而且对于微服务体系的架构也需要有扎实的知识,所以痛定思痛,从头整理,将知识点形成体系。初篇先从概述和简单使用开始;

    .NetCore百度百科定义

    .NET Core是适用于 Windows、Linux 和 macOS 的免费、开源托管的计算机软件框架,是微软开发的第一个官方版本,具有跨平台能力的应用程序开发框架 (Application Framework);

    .NetCore应用场景,如下图:

    官方说明,.NetCore在桌面程序、Web、云、移动、游戏、物联网、AI领域都能进行开发。对于我自己而言,Web程序和控制台程序开发的比较多,随着后续版本的发布迭代,Winform/WPF桌面应用程序应该也是不错的选择,毕竟界面开发的便捷性是很大的优势,但个人觉得像桌面程序后续做工具、单机项目及内部小项目会使用,大型项目应该采取Web架构更加适合(个人理解);

    .NetCore版本发布

    时间
    版本
    备注
    2016年2月
    .Net Core 1.0 RC1
    2016年5月.Net Core 1.0 RC2
    2016年6月.Net Core 1.0 
    2017年3月.Net Core 1.1 
    2017年8月.Net Core 2.0 
    2018年5月.Net Core 2.1(LTS)长期支持版本
    2018年12月.Net Core 2.2 
    2019年9月.Net Core 3.0(Maintenance) 
    2019年12月.Net Core 3.1(LTS)长期支持版本
    2020年11月
    .NET5.0

    2021年11月
    .NET6.0(LTS)长期支持版本
    2022年11月
    .NET7.0
    2023年11月.NET8.0(LTS)长期支持版本

    根据以上表格体现,其实微软在很早之前就开始做.NetCore进行布局了,从2016年开始发布对应版,起初迭代还是相对比较快的;其中LTS版本是长期支持版本,相对比较推荐; 目前3.1是推荐使用版本,后续微软计划每一年发布一个版本,其中偶数版本为LTS版本;

    后续版本为什么直接到NET5.0(非官方定义)

    从NET5.0版本开始,将不再区分.NetFrameWork和.NetCore,统一叫.NET,之前之所以叫.NetCore,应该就是为了区分两个版本;至于为什么版本直接从3.0到5.0,因为现在.NetFrameWork是4.8了,由于后续是兼容版本,如果再起4.x版本的话就会感觉冲突,所以直接到5.0;(哈哈哈,这样理解其实挺合理);

    开发工具

    微软提供了几款开发工具,适应于各平台的开发,如下图:

    可以根据自己环境选择不同的开发工具;

    HelloWorld走起

    如果在Windows安装的是VisaulStudio的话,在安装过程中就安装了SDK,如果用Visual Studio Code,那么需要单独安装对应的SDK;这里默认都安装好了;

    1. 打开开发工具,创建新项目;

    2. 搜索控制台,选择第一个;

    3. 项目命名,选择对应文件夹;

    4. 点击创建,生成项目,然后直接运行;

    总结

        概述就这么多吧,如果需要详细了解,去官网或搜索引擎去详看;下一篇简述Asp.NetCore的启动过程;

    展开全文
  • <div><p>Moving Microsoft.NETCore.Platforms and Microsoft.NETCore.Targets to csproj so that we can directly add project references to these csprojs. This will also correct the assets.json file which ...
  • 点我——&gt; ASP.NETCore 安装CentOs .NetCore环境
    展开全文
  • Microsoft.NETCore.App package (see dotnet/runtime#3528): <ul><li>Microsoft.NETCore.Targets</li><li>This will help fix ...
  • Microsoft.NETCore.Runtime.CoreCLR v1.1.0 is listed as package available for update. Trying to update fails with error message: <p>GET ...
  • 一个Asp.NetCore项目,知道大概的启动流程是有必要的,比如后续遇见配置信息覆盖等相关问题时也大概知道是什么原因,了解原因之后,再去搜索引擎找答案,否则目标不明确,茫茫人海怎么会一下找到自己想要的,除非是...

    前言

    一个Asp.NetCore项目,知道大概的启动流程是有必要的,比如后续遇见配置信息覆盖等相关问题时也大概知道是什么原因,了解原因之后,再去搜索引擎找答案,否则目标不明确,茫茫人海怎么会一下找到自己想要的,除非是“偶遇”;“偶遇”太难,一起浅析一个Asp.NetCore 项目的启动流程;

    正文

    先创建一个WebAPI项目,用的是.NetCore3.1,后续的项目例子都统一用.NetCore3.1,除非特殊说明;项目如下:

    如上图所示,一个WebAPI项目启动方式本质也是一个控制台程序,程序入口都是从Main函数开始,就从里面方法看看大概都做了什么,其中择取几个方法源码简要说明主要功能,通过增加代码注释的方式(我觉得这样比较方便对应浏览),完整源代码从以下两个地址获取,通过Everything查找工具比较方便查询代码:

    主项目地址:https://github.com/dotnet/aspnetcore/tree/v3.1.0
    扩展项目地址:https://github.com/dotnet/extensions/releases/tag/v3.1.6

    1. Host.CreateDefaultBuilder方法

    public static IHostBuilder CreateDefaultBuilder(string[] args)
            {
             // 实例化一个HostBuilder
                var builder = new HostBuilder();
             // 设置根目录
                builder.UseContentRoot(Directory.GetCurrentDirectory());
             // 设置 Host相关配置的配置源
                builder.ConfigureHostConfiguration(config =>
                {
              // 从环境变量中获取,前缀名为DOTNET_
                    config.AddEnvironmentVariables(prefix: "DOTNET_");
                    // 如果命令行中有参数,可从命令行中读取
                    if (args != null)
                    {
                        config.AddCommandLine(args);
                    }
                });
         
             // 设置应用程序配置的配置源
                builder.ConfigureAppConfiguration((hostingContext, config) =>
                {
                    var env = hostingContext.HostingEnvironment;
              //根据运行环境加载不同的配置文件,并开启了热更新
                    config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                          .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);
    
                    if (env.IsDevelopment() && !string.IsNullOrEmpty(env.ApplicationName))
                    {
                        var appAssembly = Assembly.Load(new AssemblyName(env.ApplicationName));
                        if (appAssembly != null)
                        {
                            config.AddUserSecrets(appAssembly, optional: true);
                        }
                    }
              //可从环境变量中获取
                    config.AddEnvironmentVariables();
                   // 如果命令行中有参数,可从命令行中读取
                    if (args != null)
                    {
                        config.AddCommandLine(args);
                    }
                })
             // 配置日志显示
                .ConfigureLogging((hostingContext, logging) =>
                {
              //判断操作系统
                    var isWindows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows);
              // 如果是Windows系统,配置对应的显示级别
                    // IMPORTANT: This needs to be added *before* configuration is loaded, this lets
                    // the defaults be overridden by the configuration.
                    if (isWindows)
                    {
                        // Default the EventLogLoggerProvider to warning or above
                        logging.AddFilter<EventLogLoggerProvider>(level => level >= LogLevel.Warning);
                    }
               //获取配置文件中Logging 段相关的配置信息添加到日志配置中
                    logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
                    // 在控制台输出,所以启动程序的时候就看见输出日志
               logging.AddConsole();
              // 在Debug窗口输出
                    logging.AddDebug();
                    logging.AddEventSourceLogger();
    
              // 如果是Windows系统,可以在系统日志中输出日志
                    if (isWindows)
                    {
                        // Add the EventLogLoggerProvider on windows machines
                        logging.AddEventLog();
                    }
                })//使用默认的依赖注入容器
                .UseDefaultServiceProvider((context, options) =>
                {
                    var isDevelopment = context.HostingEnvironment.IsDevelopment();
                    options.ValidateScopes = isDevelopment;
                    options.ValidateOnBuild = isDevelopment;
                });
    
                return builder;
            }
    

    2. ConfigureWebHostDefaults 方法

     public static IHostBuilder CreateDefaultBuilder(string[] args)
            {
             // 实例化一个HostBuilder
                var builder = new HostBuilder();
             // 设置根目录
                builder.UseContentRoot(Directory.GetCurrentDirectory());
             // 设置 Host相关配置的配置源
                builder.ConfigureHostConfiguration(config =>
                {
              // 从环境变量中获取,前缀名为DOTNET_
                    config.AddEnvironmentVariables(prefix: "DOTNET_");
                    // 如果命令行中有参数,可从命令行中读取
                    if (args != null)
                    {
                        config.AddCommandLine(args);
                    }
                });
         
             // 设置应用程序配置的配置源
                builder.ConfigureAppConfiguration((hostingContext, config) =>
                {
                    var env = hostingContext.HostingEnvironment;
              //根据运行环境加载不同的配置文件,并开启了热更新
                    config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                          .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);
    
                    if (env.IsDevelopment() && !string.IsNullOrEmpty(env.ApplicationName))
                    {
                        var appAssembly = Assembly.Load(new AssemblyName(env.ApplicationName));
                        if (appAssembly != null)
                        {
                            config.AddUserSecrets(appAssembly, optional: true);
                        }
                    }
              //可从环境变量中获取
                    config.AddEnvironmentVariables();
                   // 如果命令行中有参数,可从命令行中读取
                    if (args != null)
                    {
                        config.AddCommandLine(args);
                    }
                })
             // 配置日志显示
                .ConfigureLogging((hostingContext, logging) =>
                {
              //判断操作系统
                    var isWindows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows);
              // 如果是Windows系统,配置对应的显示级别
                    // IMPORTANT: This needs to be added *before* configuration is loaded, this lets
                    // the defaults be overridden by the configuration.
                    if (isWindows)
                    {
                        // Default the EventLogLoggerProvider to warning or above
                        logging.AddFilter<EventLogLoggerProvider>(level => level >= LogLevel.Warning);
                    }
               //获取配置文件中Logging 段相关的配置信息添加到日志配置中
                    logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
                    // 在控制台输出,所以启动程序的时候就看见输出日志
               logging.AddConsole();
              // 在Debug窗口输出
                    logging.AddDebug();
                    logging.AddEventSourceLogger();
    
              // 如果是Windows系统,可以在系统日志中输出日志
                    if (isWindows)
                    {
                        // Add the EventLogLoggerProvider on windows machines
                        logging.AddEventLog();
                    }
                })//使用默认的依赖注入容器
                .UseDefaultServiceProvider((context, options) =>
                {
                    var isDevelopment = context.HostingEnvironment.IsDevelopment();
                    options.ValidateScopes = isDevelopment;
                    options.ValidateOnBuild = isDevelopment;
                });
    
                return builder;
            }
    2. ConfigureWebHostDefaults 方法
     
    
    public static IHostBuilder ConfigureWebHostDefaults(this IHostBuilder builder, Action<IWebHostBuilder> configure)
            {
                return builder.ConfigureWebHost(webHostBuilder =>
                {
              //指定是用的服务器及集成一些默认管道
                    WebHost.ConfigureWebDefaults(webHostBuilder);
              // 调用传入的委托,这里是外部指定Startup类做服务注册和管道配置
                    configure(webHostBuilder);
                });
            }
    

    2.1 WebHost.ConfigureWebDefaults方法

    internal static void ConfigureWebDefaults(IWebHostBuilder builder)
            {
                builder.ConfigureAppConfiguration((ctx, cb) =>
                {
                    if (ctx.HostingEnvironment.IsDevelopment())
                    {
                //静态文件环境的配置启用
                        StaticWebAssetsLoader.UseStaticWebAssets(ctx.HostingEnvironment, ctx.Configuration);
                    }
                });
                // 指定Kestrel作为默认的Web服务器
                builder.UseKestrel((builderContext, options) =>
                {
                    options.Configure(builderContext.Configuration.GetSection("Kestrel"));
                })// 服务中间的注册,包含路的中间件注册
                .ConfigureServices((hostingContext, services) =>
                {
              // 针对配置节点AllowedHosts改变时的回调
                    // Fallback
                    services.PostConfigure<HostFilteringOptions>(options =>
                    {
                        if (options.AllowedHosts == null || options.AllowedHosts.Count == 0)
                        {
                            // "AllowedHosts": "localhost;127.0.0.1;[::1]"
                            var hosts = hostingContext.Configuration["AllowedHosts"]?.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
                            // Fall back to "*" to disable.
                            options.AllowedHosts = (hosts?.Length > 0 ? hosts : new[] { "*" });
                        }
                    });
              //对应配置改变时触发通知
                    // Change notification
                    services.AddSingleton<IOptionsChangeTokenSource<HostFilteringOptions>>(
                                new ConfigurationChangeTokenSource<HostFilteringOptions>(hostingContext.Configuration));
    
                    services.AddTransient<IStartupFilter, HostFilteringStartupFilter>();
    
                    if (string.Equals("true", hostingContext.Configuration["ForwardedHeaders_Enabled"], StringComparison.OrdinalIgnoreCase))
                    {
                        services.Configure<ForwardedHeadersOptions>(options =>
                        {
                            options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
                            // Only loopback proxies are allowed by default. Clear that restriction because forwarders are
                            // being enabled by explicit configuration.
                            options.KnownNetworks.Clear();
                            options.KnownProxies.Clear();
                        });
    
                        services.AddTransient<IStartupFilter, ForwardedHeadersStartupFilter>();
                    }
                    services.AddRouting();
                })//对使用IIS相关中间件
                .UseIIS()
                .UseIISIntegration();
            }
    

    3. Build方法,其实这个方法就是根据之前配置构造出一个IHost对象

    public IHost Build()
            {
                if (_hostBuilt)
                {
                    throw new InvalidOperationException("Build can only be called once.");
                }
                _hostBuilt = true;
             // 执行ConfigureHostConfiguration添加的一系列配置回调方法
                BuildHostConfiguration();
             // 运行环境相关创建,如ApplicationName、EnvironmentName、ContentRootPath等
                CreateHostingEnvironment();
             // 构建HostBuilder
                CreateHostBuilderContext();
                // 执行ConfigureAppConfigureation添加的一系列配置回调方法
                BuildAppConfiguration();
             // 注入默认服务如:IHost、ILogging等,执行ConfigureServices添加的一系列回调方法
                CreateServiceProvider();
                return _appServices.GetRequiredService<IHost>();
            }
    

    4. Run()方法,开启服务器,之后就可以进行请求了

    综上几个关键方法,从其中Host这个关键词出现很多次,其实在http://Asp.Net Core应用中是通过配置并启动一个Host来完成应用程序的启动和生命周期的管理。而Host主要就是对Web Server的配置和请求处理管理的管理,简要流程如下图:

     

     

    在整个启动流程中,返回的IHostBuilder中暴露配置和注入的相关接口,可用于自己定义扩展,接下来通过打印的方式来看看一下几个暴露方法的执行顺序,其实以上Build方法的时候已经明确了对应方法的顺序;

     

    改造代码如下:

    Startup方法中的三个方法也增加对应的打印,运行如下:

    如上图,除了Startup中的ConfigureServices会跟随ConfigureWebHostDefaults改变以外,其他方法顺序都是固定。那这些方法主要作用都是什么呢?如下图:

    图中Program.ConfigureServices和Startup.ConfigureServices的执行顺序会根据ConfigureWebHostDefaults的位置改变会交替变动;

    总结

    以上内容只是提取了其中比较关键的流程进行说明,并没有详细解析源代码,这里只是先浅析,后续再继续一起深究源代码;下一节说说依赖注入;

    关注公众号“Code综艺圈”,一起来学习啦;

     

    展开全文
  • 此篇文章用来了解.NetCore的依赖注入方面的问题。 此篇文章参考了博客:全面理解依赖注入,这个大佬写的很好,我是在他的理解之上加入了自己的理解,我说的不明白的地方可以去看看和这个大佬写的。 什么是依赖注入?...
  • Java Spring Boot VS .NetCore (一)来一个简单的 Hello World Java Spring Boot VS .NetCore (二)实现一个过滤器Filter Java Spring Boot VS .NetCore (三)Ioc容器处理 Java Spring Boot VS .NetCore (四...
  • Java Spring Boot VS .NetCore (一)来一个简单的 Hello World Java Spring Boot VS .NetCore (二)实现一个过滤器Filter Java Spring Boot VS .NetCore (三)Ioc容器处理 Java Spring Boot VS .NetCore (四...
  • Java Spring Boot VS .NetCore (一)来一个简单的 Hello World Java Spring Boot VS .NetCore (二)实现一个过滤器Filter Java Spring Boot VS .NetCore (三)Ioc容器处理 Java Spring Boot VS .NetCore (四...
  • Warning AD1000 An instance of analyzer Microsoft.NetCore.Analyzers.Runtime.TestForNaNCorrectlyAnalyzer cannot be created from C:\USERS\USER\APPDATA\LOCAL\MICROSOFT\VISUALSTUDIO\15.0_3E26AB4A\...
  • Java Spring Boot VS .NetCore (一)来一个简单的 Hello World Java Spring Boot VS .NetCore (二)实现一个过滤器Filter Java Spring Boot VS .NetCore (三)Ioc容器处理 Java Spring Boot VS .NetCore (四...
  • 自动.netcore升级到3.0以后,.net圈子更活跃了,写博客的人也越来越多,很多人开通了公众号写文章;也有技术大牛神乘这波“红利”写书录视频教程等赚钱了。大公司也开始关注.net技术,采用.net作为技术栈的公司大...
  • asp.netcore.pdf

    2020-09-27 17:39:55
    asp.netcore基础知识介绍。整理了微软官方asp.netcore的知识介绍。适合平时进行学习、提炼、提高asp.netcore水平。
  • 试验环境 win10 x64 centos7.6 ....netcore入门3:vs2019开发.netcore 控制台程序(编译、打包、发布)(.netcore 2.2) .netcore入门5:linux上安装.net core sdk 3.1.101(离线安装和yum仓库安装) .n...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 12,061
精华内容 4,824
关键字:

.netcore