<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      .net core和efcore code first學習總結

      項目改造建議:在將項目改成.net core之前,一定要先學習,不然很容易踩坑,導致項目進度變慢,.net core和asp.net mvc有很大區別
      學習地址
      https://docs.microsoft.com/zh-cn/aspnet/core/migration/mvc?view=aspnetcore-2.2
      https://www.bilibili.com/video/av38392956/?p=8   強烈推薦
      https://www.yuque.com/yuejiangliu/dotnet/solenovex-core-mvc-comp
      http://www.rzrgm.cn/chillsrc/p/10509412.html
      https://ken.io/note/asp.net-core-tutorial-mvc-view-layout-section

       

      項目發布到網站:

      http://www.rzrgm.cn/craigtaylor/p/11143484.html

      http://www.rzrgm.cn/humin/p/10330983.html

      http://www.rzrgm.cn/MrHSR/p/10374981.html#4444989 asp.net core系列 24 EF模型配置(主鍵,生成值,最大長度,并發標記)
      快速開發技巧:
      自動生成構造函數,在類下輸入ctor+tab鍵按兩下
      方法里面參數自動生成屬性,寫完參數后,按ctrl+.,會彈出提示,然后選擇后回車即可

      在非div元素處鼠標右鍵,使用<div>換行,會在元素前后加上div標簽

      特別注意:.net core2.1中分組條件,必須使用new,不然單個字段分組時,不起作用,如entity.GroupBy(a => new { a.CategoryId }).Select<Xxx>

      1、后臺使用 HtmlEncoder.Default.Encode 防止惡意輸入(即 JavaScript)損害應用
            防止重復提交常用辦法:post-redirect-get,RedirectToAction(nameOf(Detail)),使用nameOf利于重構

      2、項目安裝mysql的ef支持
      MySql.Data.EntityFrameworkCore、Microsoft.EntityFrameworkCore.Tools、Microsoft.EntityFrameworkCore.Proxies(延時加載)
      使用Pomelo.EntityFrameworkCore.MySql替代MySql.Data.EntityFrameworkCore,因為efcore操作mysql時,出現錯誤System.InvalidOperationException:“No coercion operator is defined between types 'System.Int16' and 'System.Boolean'.”

      Sql Server 請安裝 Microsoft.EntityFrameworkCore.SqlServer

      3、netcore項目支持依賴注入,nuget添加Microsoft.Extensions.DependencyInjection  https://stackoverflow.com/questions/32459670/resolving-instances-with-asp-net-core-di

      4、efcore配置(配置 DbContext、連接字符串等)https://docs.microsoft.com/zh-cn/ef/core/miscellaneous/connection-strings

      5、設置級聯刪除https://www.jianshu.com/p/39da9b023c81

      6、目前針對dotnet core項目的nuget包,還不支持執行包里的代碼模板和識別Content內容,所以暫時無法實現(不能通過nuget獲取js庫或者css第三方庫,使用vs自帶libman最方便)
            詳情參考 https://docs.microsoft.com/zh-cn/nuget/create-packages/project-json-impact

           (6.1)、Bower 的安裝,JS包默認安裝到webroot的lib文件夾,可以通過.bowerrc文件更改安裝路徑(不推薦使用,會將很多無用的js和文件下載到項目中)
           https://blog.csdn.net/qq_33303204/article/details/81323512
           http://www.rzrgm.cn/wanghaibin/p/9116816.html
           http://www.rzrgm.cn/beginfromnow/p/6883747.html
           在安裝 Bower 前,請安裝它的以下依賴組件nodejs、git
           安裝完成后打開 CMD 執行以下語句在全局中安裝 Bower:npm install -g bower
           安裝完成后可執行以下命令驗證是否安裝成功:bower -v
           在 Visual Studio 中建立 ASP.NET Core Web 應用程序。
           首先你可以看到依賴項內沒有 Bower 管理,在項目右鍵也發現無管理 Bower 程序包選項。
           此時我們打開 CMD。切換到項目目錄內(包含 *.csproj 的文件夾)。輸入以下命令初始化 Bower (請不要使用 PowerShell ):
           bower init
           在vs項目下.bowerrc文件,配置外部工具中一定要去除$(VSInstalledExternalTools)或$(VSINSTALLDIR)\Web\External勾選,不然不能下載或更新文件到wwwroot/lib中

          (6.2)、使用LibMan添加依賴js和css庫,強烈推薦使用此種方法添加js和css庫
           https://docs.microsoft.com/zh-cn/aspnet/core/client-side/libman/libman-vs?view=aspnetcore-2.2
           https://blog.csdn.net/qq_22949043/article/details/86766808
           手動還原文件
           若要手動還原庫文件:
           對于解決方案中的所有項目:
           右鍵單擊解決方案的名稱解決方案資源管理器。
           選擇還原客戶端庫選項。
           對于特定的項目:
           右鍵單擊libman.json中的文件解決方案資源管理器。
           選擇還原客戶端庫選項。
           如果添加客戶端庫時選擇提供程序為unpkg,必須輸入完下載的框架后,然后@版本號才有提示
           添加jquery.validate.js等庫,搜索使用jquery-validate、jquery-validation-unobtrusive

          (6.3)、配置使用npm文件安裝目錄node_modules像wwwroot目錄一樣可以使用靜態文件
           在Startup.cs中加入如下代碼
           app.UseStaticFiles(new StaticFileOptions
           { 
           RequestPath = "/node_modules",
           FileProvider = new PhysicalFileProvider(Path.Combine(env.ContentRootPath,"/node_modules")) 
           });
           //使用<link href="~/node_modules/bootstrap/bootstrap.css">

      7、efcore ef code first自動遷移,需要自動在數據庫中新建表     

      CREATE TABLE __EFMigrationsHistory
      ( 
      MigrationId nvarchar(150) NOT NULL, 
      ProductVersion nvarchar(32) NOT NULL, 
      PRIMARY KEY (`MigrationId`) 
      );
      end;

       

      8、ef core操作mysql 數據遷移需要導入Microsoft.EntityFrameworkCore.Design,版本是2.0.0;

      http://www.rzrgm.cn/whyd/p/9348325.html
      http://www.rzrgm.cn/Saumterer/p/7605340.html


      9、ef code first一對多配置:https://blog.csdn.net/Fanbin168/article/details/81745861


      10、執行數據庫遷移命令時,提示不支持PowerShell 2.0版本(don't support PowerShell version 2.0. )解決
             https://www.bbsmax.com/A/6pdDBl6DJw 非常好
             http://www.rzrgm.cn/systemnet123/p/10262096.html
             http://www.mamicode.com/info-detail-2584332.html

             Add-Migration Xxxx,每次增加或修改類后,都要重新執行此命令
            Update-Database -v 馬上同步本地數據庫,不適合正式環境
            當執行以上命令時,如果出現錯誤Build failed,選中項目解決方案-》右鍵-》重新生成解決方案,看下項目是否有報錯的地方,當重新生成成功后,一般就可以執行了,如果還是不行,參考http://www.rzrgm.cn/DHclly/p/11332591.html

      11、Startup.cs取代Global.asax,Startup類負責處理所有應用程序啟動任務
             BundleConfig.cs在asp.net core里面不存了,安裝Bundler & Minifier工具替代
             要引用處理完的指令碼檔,在過去是使用 @Scripts.Render() 或 @Styles.Render() 將指令碼檔加入到網頁之中,現在只要在引用打包完後的指令碼檔時,加一個屬性叫 asp-append-version 的 TagHelper,把它設定為 true 就可以了。
             https://dotblogs.com.tw/supershowwei/2017/07/26/164153
             https://dotnetthoughts.net/bundling-and-minification-in-aspnet-core/
             https://marketplace.visualstudio.com/items?itemName=MadsKristensen.BundlerMinifier
             http://www.rzrgm.cn/yunspider/p/9746555.html

      12、Razor指令可以根據規則從 HTML 轉換為 C# 或 Razor 特定標記。 當在 @ 符號后跟 Razor 保留關鍵字時,它會轉換為 Razor 特定標記,如果不是Razor保留關鍵字,則會轉換為 C#。
             @page Razor 指令將文件轉換為一個 MVC 操作,這意味著它可以處理請求。 @page 必須是頁面上的第一個 Razor 指令。 @page 是轉換成 Razor 特定標記的一個示例。

      13、mvc模板頁使用:@RenderSection("header", false)

             @RenderBody()
             @RenderSection("Scripts", required: false)//required: false表示不是必須的
             子頁面:@section header
             {}
             @section Scripts {
             @{
             await Html.RenderPartialAsync("_ValidationScriptsPartial");}
             }
             https://ken.io/note/asp.net-core-tutorial-mvc-view-layout-section


      14、頁面文件介紹
      _layout.cshtml文件中包含通用的HTML元素(腳本和樣式表)和應用程序的總體布局。例如,當你點擊RazorMvcBooks,Home,About的鏈接時,你會看到同樣的頁眉與頁腳布局。
      _viewstart.cshtml文件當作_layout.cshtml文件的布局屬性來使用。可以放公用html
      _viewimports.cshtml包含導入到每個Razor頁面的Razor指令。
      _validationscriptspartial.cshtml文件提供對jQuery驗證腳本的引用。當我們添加創建和編輯網頁時,_validationscriptspartial.cshtml文件將被使用。
      @Html.PartialAsync("_PartialViewName",data):復用View代碼,@Html.Partial()未舊方法或使用
      使用<partial name="_StudentRow" for="@s">替換@Html.Partial
      @await Commponent.InvokeAsync("XXX"):可復用、獨立組件、有獨立的邏輯/數據、相當于迷你mvc請求、不依賴于父級View的數據,通常放到ViewComponents文件夾下
      taghelper對于寫法<vc:welcome></vc:welcome>,必須在_ViewImports.cshtml導入當前項目命名空間才能使用

      15、@Html.使用TagHelper替代,Tag helpers是服務器端的C#代碼,它在Razor文件里,它會參與到創建和渲染HTML元素的過程。
      asp-開頭都是taghelper,asp-action、asp-controller、asp-route-id、asp-route-name、asp-for、asp-items、asp-validation-for
      _ViewImports.cshtml
      @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
      <select asp-for="Gender" asp-items="Html.GetEnumSelectList<Gender>()"></select>
      <span asp-validation-for="birthdate"></span>
      <span asp-validation-summary="All"></span> 模型錯誤匯總顯示
      <span asp-validation-summary="ModelOnly"></span> ModelState.AddModelError()添加的錯誤才會顯示
      15.1、JavaScript TagHelpers
      asp-src-include:導入指定目錄下的所有js文件,<script asp-src-include="~app/**/*.js" asp-src-exclude="~app/services/**/*.js">
      asp-src-exclude:排除指定目錄下的所有js文件
      asp-fallback-src:使用cdn導入js如果失敗,則使用此本地地址文件
      asp-fallback-test:測試cdn的js是否引入成功
      15.2、Css TagHelpers
      asp-fallback-href:使用cdn導入css如果失敗,則使用此本地地址文件
      asp-fallback-test-class:測試cdn文件中是否存在指定類選擇器
      asp-fallback-test-property:測試cdn文件中是否存在指定屬性
      asp-fallback-test-value:測試cdn文件中指定屬性是否存在指定值

      15.3、asp-append-version:版本號,追加文件Hash值,通常和src一起使用

      15.4、自定義元素TagHelper,新建類,類名以TagHelper結尾,繼承TagHelper,重寫Process方法
      自定義TagHelper要在_ViewImport.cshtml中導入,如@addTagHelper *,Heavy.Web

       使用TagHelper:<email mail-to="123@qq.com">support</email>

      15.5、自定義屬性TagHelper
      <bold color="green">加粗字體<bold>
      <p bold color="red">加粗字體</p>

       15.6、自定義類屬性TagHelper

       使用自定義類TagHelper:

       15.7、屬性條件TagHelper

       

       使用條件TagHelper

       15.8、TagHelper前綴,可以頁面中指定前綴的元素,TagHelper才生效
      @tagHelperPrefix "my:"

       

       

      16、獲取控制器和action名稱
      this.ControllerContext.ActionDescriptor.ControllerName
      this.ControllerContext.ActionDescriptor.ActionName

      17、.net core Identity用戶登錄使用
      核心對象UserManager<IdentityUser>、SignInManager<IdentityUser>、RoleManager<IdentityRole>
      使用在Startup.cs中配置
      string connectionString = Configuration.GetConnectionString("MysqlConnection");
      //注冊數據庫上下文
      services.AddDbContext<Data.NBSharpDbContext>(options => options.UseMySql(connectionString));
      //注冊Identity
      services.AddDbContext<IdentityDbContext>(options => options.UseMySql(connectionString));
      services.AddIdentity<IdentityUser, IdentityRole>(options =>
      {
      options.Password.RequireNonAlphanumeric = false;
      options.Password.RequireLowercase = false;
      options.Password.RequireUppercase = false;
      options.Password.RequiredLength = 1;
      }).AddEntityFrameworkStores<IdentityDbContext>();
      app.UseAuthentication();//全局身份認證,必須放在app.UseMvc()之前
      執行數據庫遷移Add-migration InitIdentity -Context IdentityDbContext
      //頁面中判斷是否登錄@if(SignInManager.IsSignedIn(User)){...}
      //Controller用戶登錄才能訪問,再Controller或Action上加上[Authorize]即可

       

      18、頁面中使用注入對象@inject SignInManager<IdentityUser> SignInManager
          SignInManager為變量名

      19、mvp提供增刪改查參考https://github.com/solenovex/ASP.NET-Core-MVC-Tutorial-Code
      RoleController AddUserToRole()中代碼應該調整為
      // 使用SQL語句的方式實現
      // 方法一、推薦,先查所有用戶,再查角色的用戶,然后在內存中排除
      // 所有用戶
      var users = await _userManager.Users*************);
      // 當前角色包含的用戶
      var users2 = await _userManager.Users.FromSql(
      "select u.* from AspNetUsers u, AspNetUserRoles r where u.Id = r.UserId and r.RoleId = @roleId ",
      new SqlParameter("@roleId", roleId))*************);
      // 添加當前角色不包含的用戶
      vm.Users.AddRange(users.Where(u => users2.Contains(u) == false));
      // 方法二、不推薦,直接使用 not in語句
      //vm.Users.AddRange(await _userManager.Users.FromSql(
      // "select u.* from AspNetUsers u where u.Id not in (select UserId from AspNetUserRoles where RoleId = {0})",
      // roleId)*************));

      20、.net-core的api接口不再返回HttpResponseMessage,返回和mvc控制層一樣、可以是JsonResult、void、string等待

      21、.net-core里面使用HttpContext對象
            

      public class xxxAppService : PlatformAppService
      {
          private readonly IHttpContextAccessor httpContextAccessor;
       
          public xxxAppService(IHttpContextAccessor _httpContextAccessor)
          {
              httpContextAccessor = _httpContextAccessor;
          }
       
          public async Task<string> GetHeaders()
          {
              var headers = httpContextAccessor.HttpContext.Request.Headers;
       
              return headers["Authorization"];
          }
      }

      22、.netcore中使用HttpContext對象  https://docs.microsoft.com/en-us/aspnet/core/fundamentals/http-context?view=aspnetcore-2.2 

      23、.netcore執行sql查詢 語句https://docs.microsoft.com/zh-cn/ef/core/querying/raw-sql

              默認生成的為Person的Model,如果Select獲取的字段中不包含Person中的某字段就會拋異常了,例如:下面的語句只獲取name字段,并沒有包含Person的其他字段,那么拋異常:The required column 'id' was not present in the results of a 'FromSql' operation.

      db.Set<Person>().FromSql($"select name from {nameof(Person)} ").ToList();
      那么改為:
      db.Set<Person>().Select(l => l.name).FromSql($"select name from {nameof(Person)} ").ToList();

       24、View Component
      顯示部分內容、Mini Controller、可復用、只能配合父級View使用
      實現ViewComponent

       使用ViewComponent,新建文件夾:Components/InternetStatus/Default.cshtml(可放到Shared文件夾下,全局通用)

       

       具體頁面中使用此ViewComponent@await Component.InvokeAsync("InternetStatus")

       25、診斷中間件UseDeveloperExceptionPage、UseStatusCodePages、UseExceptionHandler、UseWelcomePage

       

      39、悲觀并發控制和樂觀并發控制

      悲觀并發控制:

      (1)、悲觀并發控制一般采用行鎖、表鎖等排他鎖對資源進行鎖定,確保同時只有一個使用者操作被鎖定的資源。

      (2)、EF Core沒有封裝悲觀并發控制的使用,需要開發人員編寫原生SQL語句來使用悲觀并發控制。不同數據庫的語法不一樣。

      (3)、鎖是獨占、排他的,如果系統并發量很大的話,會嚴重影響性能,如果使用不當的話,甚至會導致死鎖。

      (4)、不同數據庫的語法不一樣。

      鎖是和事務相關的,因此通過BeginTransactionAsync()創建一個事務,并且在所有操作完成后調用CommitAsync()提交事務。

      var h1 = await ctx.Houses.FromSqlInterpolated($"select * from T_Houses where Id=1 for update").SingleAsync();
      

      樂觀并發控制:

      樂觀并發控制的原理

      Update T_Houses set Owner=新值 where Id=1 and Owner=舊值 舉例子。當Update的時候,如果數據庫中的Owner值已經被其他操作者更新為其他值了,那么where語句的值就會為false,因此這個Update語句影響的行數就是0,EF Core就知道“發生并發沖突”了,因此SaveChanges()方法就會拋出DbUpdateConcurrencyException異常。

      以下適用于表只有一列并發控制

      (1)、把被并發修改的屬性使用IsConcurrencyToken()設置為并發令牌。

      (2)、builder.Property(h => h.Owner).IsConcurrencyToken();

      (3)、catch(DbUpdateConcurrencyException ex) {

      var entry = ex.Entries.First();

      var dbValues = await entry.GetDatabaseValuesAsync();

      string newOwner = dbValues.GetValue<string>(nameof(House.Owner));

      Console.WriteLine($"并發沖突,被{newOwner}提前搶走了");

      }

      通過rowversion解決表有多列需要并發控制

      class House
      {
          public long Id { get; set; }
          public string Name { get; set; }
          public string Owner { get; set; }
          public byte[] RowVer { get; set; }
      }
      builder.Property(h => h.RowVer).IsRowVersion();

       

      1、樂觀并發控制能夠避免悲觀鎖帶來的性能、死鎖等問題,因此推薦使用樂觀并發控制而不是悲觀鎖。

      2、如果有一個確定的字段要被進行并發控制,那么使用IsConcurrencyToken()把這個字段設置為并發令牌即可;

      3、如果無法確定一個唯一的并發令牌列,那么就可以引入一個額外的屬性設置為并發令牌,并且在每次更新數據的時候,手動更新這一列的值。如果用的是SQLServer數據庫,那么也可以采用RowVersion列,這樣就不用開發者手動來在每次更新數據的時候,手動更新并發令牌的值了。

       

       

      40、FluentValidation

      1、FluentValidation:用類似于EF Core中Fluent API的方式進行校驗規則的配置,也就是我們可以把對模型類的校驗放到單獨的校驗類中。

      2、 FluentValidation在ASP.NET Core項目中的用法

      1)NuGet:FluentValidation.AspNetCore

      2)builder.Services.AddFluentValidation(fv => { Assembly assembly = Assembly.GetExecutingAssembly();

      fv.RegisterValidatorsFromAssembly(assembly);// RegisterValidatorsFromAssemblies });

      3)編寫模型類Login2Request public record Login2Request(string Email, string Password, string Password2);

      4)編寫繼承自AbstractValidator的數據校驗類

      public class Login2RequestValidator: AbstractValidator<Login2Request> {

          public Login2RequestValidator() {

              RuleFor(x=>x.Email).NotNull().EmailAddress() .Must(v=>v.EndsWith("@qq.com")||v.EndsWith("@163.com")) .WithMessage("只支持QQ和163郵箱");

              RuleFor(x => x.Password).NotNull().Length(3, 10) .WithMessage("密碼長度必須介于3到10之間") .Equal(x => x.Password2).WithMessage("兩次密碼必須一致");

          }

      }

      5)用Login2Request做Action方法的參數。

      調用數據庫服務

      1、可以通過構造方法來向數據校驗類中注入服務

      2、RuleFor(x => x.UserName).NotNull() .Must(name=>dbCtx.Users.Any(u=>u.UserName== name)) .WithMessage(c => $"用戶名{c.UserName}不存在");

      3、RuleFor(x => x.UserName).NotNull() .MustAsync((name,_) => dbCtx.Users.AnyAsync(u => u.UserName == name)) .WithMessage(c => $"用戶名{c.UserName}不存在");

       本地化多語言 http://www.rzrgm.cn/mq0036/p/14548370.html

      FluentValidation 為默認驗證消息提供幾種語言的翻譯,默認情況下, 會根據當前線程的 CurrentUICulture 語言文化來選擇語言,你也可以使用 WithMessage 和 WithLocalizedMessage 來指定錯誤提示。

      WithMessage

      如果使用 Visual Studio 的內置的 resx 格式資源文件, 則可以通過調用 WithMessage 本地化錯誤消息。

      RuleFor(x => x.Surname).NotNull().WithMessage(x => MyLocalizedMessages.SurnameRequired);

      當然,您可以將多種語言存儲在數據庫中,通過 lambda 表達式來讀取多語言消息。

      WithLocalizedMessage

      您可以通過調用 WithLocalizedMessage 方法,傳遞資源類型和資源名稱,使錯誤消息支持本地多語言。

      RuleFor(x => x.Surname).NotNull().WithLocalizedMessage(typeof(MyLocalizedMessages), "SurnameRequired");

       

      41、 REST的優點

      1、通過URL對資源定位,語義更清晰; 2、通過HTTP謂詞表示不同的操作,接口自描述; 3、可以對GET、PUT、DELETE請求進行重試; 4、可以用GET請求做緩存; 5、通過HTTP狀態碼反映服務器端的處理結果,統一錯誤處理機制。 6、網關等可以分析請求處理結果。

      REST的缺點

      1、真實系統中的資源非常復雜,很難清晰地進行資源的劃分,對技術人員的業務和技術水平要求高。 2、不是所有的操作都能簡單地對應到確定的HTTP謂詞中。 3、系統的進化可能會改變冪等性。 4、通過URL進行資源定位不符合中文用戶的習慣。 5、HTTP狀態碼個數有限。 6、有些環節會篡改非200響應碼的響應報文。 7、有的客戶端不支持PUT、DELETE請求。

       

      42、依賴注入性能消耗很高的特殊服務,可以通過action注入

      public class TestService
      {
          private string[] files;
          public TestService()
          {
          this.files=Directory.GetFiles("D:/Program Files","*.exe",SearchOption.AllDirectories);
          }
      
          public int Count{get{return this.files.Length;}}
      }
      [HttpGet]
      public int Test1([FromServices]TestService testService,int x)
      {
          return testService.Count+x;
      }

       

       43、同步方法中調用異步方法Main(args).GetAwaiter().GetResult();

      如果想在異步方法中暫停一段時間,不要用Thread.Sleep(),因為它會堵塞調用現場,而要用await Task.Delay()。

       

      44、異步編程
      如果想在異步方法中暫停一段時間,不要用Thread.Sleep(),因為它會堵塞調用線程,而要用await Task.Delay();

      有時需要提前終止任務,比如:請求超時、用戶取消請求。 很多異步方法都有CancellationToken參數,用于獲得提前終止執行的信號 

      CancellationToken結構體 None:空 bool IsCancellationRequested 是否取消 (*)Register(Action callback) 注冊取消監聽 ThrowIfCancellationRequested() 如果任務被取消,執行到這句話就拋異常。

      CancellationTokenSource CancelAfter()超時后發出取消信號 Cancel() 發出取消信號

      ASP.NET Core開發中,一般不需要自己處理CancellationToken、CancellationTokenSource這些,只要做到“能轉發CancellationToken就轉發”即可。ASP.NET Core會對于用戶請求中斷進行處理。

      public async Task<IActionResult> Index(CancellationToken cancellationToken)
      {
          await DownloadAsync("https://www.baidu.com",100,cancellationToken);
          return View();
      }

       

      static async Task DownloadAsync(string url, int n, CancellationToken cancellationToken)
      {
          using (HttpClient client = new HttpClient())
          {
              for (int i = 0; i < n; i++)
              {
                  string html = await client.GetStringAsync(url);
                  Console.WriteLine($"{DateTime.Now}:{html}");
                  if (cancellationToken.IsCancellationRequested)
                  {
                      Console.WriteLine("請求被取消");
                      break;
                  }
                  //cancellationToken.ThrowIfCancellationRequested();//取消拋出異常
              }
          }
      }
      static async Task Download2Async(string url, int n, CancellationToken cancellationToken)
      {
          using (HttpClient client = new HttpClient())
          {
              for (int i = 0; i < n; i++)
              {
                  var resp = await client.GetAsync(url, cancellationToken);
                  string html = await resp.Content.ReadAsStringAsync();
                  Console.WriteLine($"{DateTime.Now}:{html}");
              }
          }
      }
      
      static async Task Main(string[] args)
      {
          //CancellationTokenSource cts = new CancellationTokenSource();
          //cts.CancelAfter(5000);
          //CancellationToken cToken = cts.Token;
          //await DownloadAsync("https://www.baidu.com", 100, cToken);
      
          CancellationTokenSource cts = new CancellationTokenSource();
          CancellationToken cToken = cts.Token;
          DownloadAsync("https://www.baidu.com", 200, cToken);
          while (Console.ReadLine() != "c")
          {
      
          }
          cts.Cancel();
          Console.ReadLine();
      }

       

      Task類的重要方法:

      1. Task<Task> WhenAny(IEnumerable<Task> tasks)等,任何一個Task完成,Task就完成

      2. Task<TResult[]> WhenAll<TResult>(params Task<TResult>[] tasks)等,所有Task完成,Task才完成。用于等待多個任務執行結束,但是不在乎它們的執行順序。

      3. FromResult() 創建普通數值的Task對象。

       

      45、Linq中Single和First區別

      Single:有且只有一條滿足要求的數據;如果序列中沒有一條數據,會報錯,有多條數據,也會報錯

      SingleOrDefault:最多只有一條滿足要求的數據;

      First :至少有一條,返回第一條;如果序列中沒有一條數據,會報錯,有多條返回第一條數據,不會報錯

      FirstOrDefault:返回第一條或者默認值;

       

      46、讀取配置文件

      原始讀取方式:

      NuGet安裝Microsoft.Extensions.Configuration和Microsoft.Extensions.Configuration.Json

      ConfigurationBuilder configBuilder = new ConfigurationBuilder();

      configBuilder.AddJsonFile( "config.json", optional: false, reloadOnChange: false);

      IConfigurationRoot config = configBuilder.Build();

      string name = config["name"];

      string proxyAddress = config.GetSection("proxy:address").Value;

      optional參數表示這個文件是否可選。初學時,建議optional設置為false,這樣寫錯了的話能夠及時發現。

      reloadOnChange參數表示如果文件修改了,是否重新加載配置

      1、可以綁定一個類,自動完成配置的讀取。

      2、NuGet安裝:Microsoft.Extensions.Configuration.Binder

      3、Server server = configRoot.GetSection("proxy").Get<類名>();

       推薦讀取方式:

      NuGet再安裝:Microsoft.Extensions.Options

      讀取配置的時候,DI要聲明IOptions<T>、IOptionsMonitor<T>、IOptionsSnapshot<T>等類型。IOptions<T>不會讀取到新的值;和IOptionsMonitor 相比, IOptionsSnapshot會在同一個范圍內(比如ASP.NET Core一個http請求中)保持一致。建議用IOptionsSnapshot

      1、在讀取配置的地方,用IOptionsSnapshot<T>注入。不要在構造函數里直接讀取IOptionsSnapshot.Value,而是到用到的地方再讀取,否則就無法更新變化。

      2、如下配置 services.AddOptions() .Configure<DbSettings>(e => config.GetSection("DB").Bind(e)) .Configure<SmtpSettings>(e => config.GetSection("Smtp").Bind(e));

      services.AddTransient<Demo>();//不能用Singleton

       

       ef core中使用Like EF.Functions.Like(c.Boss, "%Jeremy%")

      .net core項目重命名后錯誤解決:

      錯誤 NETSDK1007 找不到“E:\Project\MyProject\MyProject.Common\MyProject.Utility.csproj”的項目信息。這可以指示缺少一個項目引用。 MyProject.Data C:\Program Files\dotnet\sdk\2.2.107\Sdks\Microsoft.NET.Sdk\targets\Microsof

       

      .Net Core 3.1 解決數據大小限制

       

      posted @ 2019-08-18 21:37  事理  閱讀(1247)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 自拍偷在线精品自拍偷99| 欧美一区二区三区成人久久片| 亚洲国产美女精品久久久 | 亚洲精品综合一区二区三区| 亚洲国产精品午夜福利| 绍兴市| 免费国产好深啊好涨好硬视频| 国产精品大全中文字幕| 宽甸| 婷婷综合缴情亚洲| 色噜噜久久综合伊人一本| 青田县| 天啦噜国产精品亚洲精品| 亚洲精品美女一区二区| 国产在线亚州精品内射| 亚洲爆乳WWW无码专区| 资溪县| 男女性高爱潮免费网站| 日本免费精品| 亚洲精品一区二区制服| 国产精品麻豆欧美日韩ww| 国产熟睡乱子伦视频在线播放| 日本高清视频网站www| 亚洲色婷婷一区二区三区| 久久香蕉国产线看观看怡红院妓院| 无码熟妇人妻av影音先锋| 国产女人18毛片水真多1| 美女黄网站18禁免费看| 中文字幕亚洲国产精品| 日韩av裸体在线播放| 日韩丝袜欧美人妻制服| 人妻激情文学| 亚洲精品区午夜亚洲精品区| 无码国产偷倩在线播放| 中山市| www国产精品内射熟女| 亚洲一区二区三区在线| 东京热人妻中文无码| 国产精品久久久天天影视香蕉 | 鹤庆县| 人妻有码av中文字幕久久琪|