主頁 > .NET開發 > 深度探秘.NET 5.0

深度探秘.NET 5.0

2020-11-15 23:21:08 .NET開發

今年11月10號 .NET 5.0 如約而至,這是.NET All in one后的第一個版本,雖然不是LTS(Long term support)版本,但是是生產環境可用的,

有著微軟的背書:微軟從.NET Preview 1就開始在自己的網站上運行.NET 5, (Bing.com、dot.net已升級并運行了數個月),同時早期的.NET Core版本可以直接升級到.NET 5.  所以大家是可以放心使用的,

接下來,我們深入了解一下.NET 5.0這次帶來了哪些新的特性,

一、.NET 5.0 的一些亮點(Highlights)

1. 通過線上(生產環境)測驗(battle-tested) : .NET5.0 通過在Bing.com和dot.net 托管運行數個月,全面通過了線上驗證,這證明這個版本是生產可用的

2. 性能大幅提升:GC、JIT、正則運算式、多執行緒和異步處理、集合、LINQ、網路訪問、JSON序列化、gRPC等等,了解詳細可以訪問

    • Performance Improvements in .NET 5.0
    • Arm64 Performance in .NET 5.0
    • gRPC.

3. C# 9和F# 9 的語言提升:例如C#9的頂級程式和記錄record,F#5提供了互動式編程,并提高了.NET的性能,

4. .NET庫增強了Json序列化,正則運算式和HTTP(HTTP 1.1,HTTP / 2)的性能,這一點在第二條中已經有所涉及,

5. P95 的延遲有所減少,得益于GC、分層編譯和其他組件的一些改進

6.更好、更靈活的應用部署選項:ClickOnce客戶端應用程式發布,單檔案應用程式,減小的容器映像大小以及添加的Server Core容器映像,

7.平臺支持的范圍進一步擴展:Windows Arm64和WebAssembly

 二、再看統一平臺的愿景

   2019年5月6號,微軟發布了.NET 5.0 統一平臺的愿景:將來只會有一個.NET,您將可以使用它來定位Windows,Linux,macOS,iOS,Android,tvOS,watchOS和WebAssembly等,

   

   實作這一愿景的第一步是整合.NET倉庫,即:整合關鍵的.NET代碼庫, 這是為.NET運行庫和庫提供一個存盤庫是在各處交付相同產品的前提,Blazor就是代碼合并和.NET統一的最佳示例:Blazor WebAssembly的運行時和庫現在是從合并的dotnet /運行時倉庫中構建的,這意味著服務器上的Blazor WebAssembly和Blazor使用與完全相同的代碼List<T>,

   代碼整合后,.NET Framework怎么辦?

   .NET Framework仍然是受支持的Microsoft產品,并且每個新版本的Windows都將繼續支持.NET Framework,去年,微軟宣布已停止向.NET Framework添加新功能,逐步向.NET Core添加更多的.NET Framework API,

   這就意味著,.NET Framework已經停更了,版本目前停留在.NET Framework 4.8. 

   這也是沒辦法的事情,統一后的.NET, 從.NET5.0開始迭代了,這次.NET 5.0的Release串列也能發現這個情況:

   

    在上述情況下,目前是將.NET Framework升級到.NET Core的最佳時機了,如果比較在意LTS版本,也可以等到明年.NET 6統一升級,對于此,微軟的建議是:

    對于.NET Framework客戶端開發人員,.NET 5.0支持Windows表單和WPF,

    對于.NET Framework服務器開發人員, 如果采用ASP.NET Core才能使用.NET 5.0,

    對于Web Forms開發人員,Blazor通過高效且更加現代的實作方式提供類似的開發人員體驗,

    對于WCF服務器和Workflow用戶可以查看支持這些框架的社區專案,

    以上,對于統一后的.NET 5.0, 廣大.NET Developers 可以放心、開心地去擁抱這次升級和統一,這代表了.NET的未來,

 三、深入了解一下編程語言層面的提升(C# 9 和 F# 5)

   C#9和F#5是.NET 5.0版本的一部分,被包含在.NET 5.0 SDK中,接下來詳細看一下C# 9 的一些語言新特性(F# 5用的比較少,不再做詳細介紹):

  1. Top-level programs 頂級程式

   大家會問這是什么?這是在頂級撰寫程式的一種更簡單的方式:一個更簡單的 Program.cs 檔案,

   我們知道,原先在Program類中,必須有Main函式,這是程式的一個EntryPoint入口,

using System;

namespace NET5Demo
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
        }
    }
}

   .NET 5引入Top-level programs 后,我們不需要寫Main函式了,可以直接這么寫:

System.Console.WriteLine("Hello World!");

 大家會有疑問,真的沒有Main函式了嗎?其實這是個語法糖,我們通過IL Spy看一下反編譯后的代碼:

 

  2. 邏輯模式和屬性模式匹配(Logical and property patterns)

  我們可以使用not or and 實作更強的更靈活的邏輯模式匹配:

  先看一個邏輯匹配的Demo:

var input = Console.ReadKey();
if (input.KeyChar is 'Y' or 'y')
{
    Console.WriteLine("You choosed yes!");
}

  再看一個Switch的Demo:

int score = 90;
switch (score)
{
    case 0:
        Console.WriteLine("0分.");
        break;
    case > 0 and <= 60:
        Console.WriteLine("合格.");
        break;
    case > 60 and <= 80:
        Console.WriteLine("優秀.");
        break;
    case > 80 and <= 100:
        Console.WriteLine("卓越.");
        break;
}

 屬性模式匹配:通過兩個{},實作對物件屬性的模式匹配,

Type type = Type.GetType("System.String");
if (type is not null and { FullName: "System.String" })
{
    Console.WriteLine("It's type is System.String.");
}

  3. record型別

  record是一個新增的參考型別,與class很像,那么大家會問?為什么增加一個record型別呢?它的使用場景是什么呢?

  答案:為了方便比較資料是否一致,我們寫個代碼示意一下:

  假設我們有個User類,包含ID、Name、Gender、Tel幾個屬性,如果我們要對比2個User物件是否相等,我們可能需要逐個屬性對比,或重寫Equals、GetHashCode方法,

  那么如果我們用record型別呢?

record User(int Id, string Name, int Gender, string Tel);

 做個物件對比的Demo:


var userA = new User(1, "小米", 1, "123456789");
var userB = new User(1, "小米", 1, "123456789");

if (userA == userB)
{
    Console.WriteLine("這是一個用戶.");
}

 總結一下:record型別讓開發省去了重寫相等比較的業務邏輯,同時簡化了型別定義和初始化

 4. 可空注解的增加和改進

  目前.NET library 類別庫,已經全面設定了是否可空注解,其實這個特性其實在C# 8.0已經引入:C#8.0 引入了“可為空參考型別”和“不可為空參考型別”,使你能夠對參考型別變數的屬性作出重要宣告 :

  #nullable enable
  class A{ }

  即.NET 5.0的類別庫中已經全面更新了這個注解,方便開發時進行查看,

  同時,這次引入新的成員是否為空的注解:MemberNotNull 和 MemberNotNullWhen,例如以下的代碼:

class UserManager
{
    User user = new User(1, "小米", 1, "123456789");

    [MemberNotNull(nameof(user))]
    public string GetUserName(string id)
    {
        return user.Name;
    }
}

  編譯器會智能提示:CS8602警告

  

 四、工具類的新變化

  .NET 5.0 改進了Windows表單設計器,更改了目標框架適用于.NET 5.0及更高版本的方式,更改了WinRT的支持方式,以及其他的一些改進,

  1. Windows表單設計器:winform設計器

   Windows Forms設計器(用于.NET Core 3.1和.NET 5.0)已經在Visual Studio 16.8中進行了更新,現在支持所有Windows Forms控制元件,它還支持WinForms控制元件的Telerik UI,設計器包括您期望的所有設計器功能,包括:拖放,選擇,移動和調整大小,剪切/復制/粘貼/洗掉控制元件,與屬性視窗集成,事件生成等,資料系結和對更廣泛的第三方控制元件的支持即將推出,

   

   2. .NET 5.0目標框架

   新增一個Console型別工程后,選擇目標框架是.NET 5.0, 其Project檔案內容是這樣的:

   

   新增一個Windows表單應用工程后,選擇目標框架是.NET 5.0, 其Project檔案內容是這樣的:

   

   Windows桌面API(包括Windows表單,WPF和WinRT)僅在定位時可用net5.0-windows,同時也可以指定作業系統版本,例如net5.0-windows7或net5.0-windows10.0.17763.0(對于Windows October 2018 Update),

   如果要使用WinRT API,則需要定位Windows 10版本,

   總結一下:

  • net5.0 是.NET 5.0的新目標框架綽號,Target Framework Moniker(TFM),
  • net5.0結合并替換netcoreapp和netstandard TFM,
  • net5.0支持.NET Framework兼容模式
  • net5.0-windows 將用于公開Windows特定功能,包括Windows表單,WPF和WinRT API,
  • .NET 6.0將使用相同的方法,并帶有net6.0和將添加net6.0-ios和net6.0-android,
  • 特定于作業系統的TFM可以包含作業系統版本號,例如net6.0-ios14,
  • 可移植的API(如ASP.NET Core)可與一起使用net5.0,帶有的Xamarin形式也是如此net6.0,

  3. WinRT Interop的重大改進

   在以Windows API為目標這一主題上,微軟已經移至一個新模型,以作為.NET 5.0的一部分來支持WinRT API,這包括呼叫API(在任一方向上; CLR <==> WinRT),兩個型別系統之間的資料封送處理以及打算在型別系統或ABI邊界上統一對待的型別的統一(即“投影型別” ”,IEnumerable<T>并且IIterable<T>是示例),

   從.NET 5.0開始,原有的WinRT互操作體系已被移除,這是一個巨大的變化,這意味著使用WinRT和.NET Core 3.x的應用程式和庫需要重新開發對接,并且不能按原樣在.NET 5.0上運行,

   使用WinRT API的庫將需要多目標來管理.NET Core 3.1和.NET 5.0之間的這種差異,

   未來,.NET 將依靠Windows中的WinRT團隊提供的新CsWinRT工具,它生成基于C#的WinRT互操作程式集,可以通過NuGet交付該程式集,Windows團隊正是針對Windows中的WinRT API所做的,希望將WinRT(在Windows上)用作互作業系統的任何人都可以使用該工具,以將本機API公開給.NET或將.NET API公開給本機代碼,

   關于CsWinRT工具,已經發布了1.0版本,具體可以參考鏈接:https://blogs.windows.com/windowsdeveloper/2020/11/10/announcing-c-winrt-version-1-0-with-the-net-5-ga-release/

   4. .NET Native Export/ .NET 本地匯出

    即本機二進制檔案啟用匯出功能,

   .NET 開發團隊的Aaron Robinson一直在從事.NET Native Exports專案,該專案為將.NET組件作為本機庫發布提供了更完整的體驗,

   .NET Native匯出專案能夠實作:

  • 公開自定義的本地出口,
  • 不需要像COM這樣的高級互操作技術,
  • 跨平臺作業

   類似的實作技術,還有:

  • Unmanaged Exports
  • DllExport

   5. 事件管道

   事件管道是在.NET Core 2.2中添加的新子系統和API,可以在任何作業系統上執行性能和其他診斷調查,

   在.NET 5.0中,事件管道已得到擴展,以使事件探查器能夠寫入事件管道事件,

   對于以前依靠ETW(在Windows上)監視應用程式行為和性能的分析探查器,來說是一個很好的方案和選擇,

   這里不做詳細展開了,

   6. 轉儲除錯,Dump分析除錯

   除錯托管代碼需要了解托管物件和構造,資料訪問組件(DAC)是運行時執行引擎的子集,該引擎具有這些構造的知識,并且可以在沒有運行時的情況下訪問這些托管物件,

   現在,可以使用WinDBG或Windows在Windows上分析在Linux上收集的.NET Core行程轉儲dotnet dump analyze,

   本次發布還增加了對從macOS上運行的.NET行程捕獲ELF轉儲的支持,由于ELF不是lldbmacOS上的本機可執行檔案(像這樣的本地除錯器將無法與這些轉儲一起使用)檔案格式,因此我們將其設為啟用功能,

   要在macOS上支持轉儲收集,請設定環境變數COMPlus_DbgEnableElfDumpOnMacOS=1,可以使用來分析產生的轉儲dotnet dump analyze,

   7. 列印環境資訊

   隨著.NET擴展了對新作業系統和芯片體系結構的支持,有時需要一種列印環境資訊的方法,.NET 5.0 創建了一個簡單的.NET工具來執行此操作,稱為dotnet-runtimeinfo,可以使用以下命令安裝和運行該工具:

dotnet tool install -g dotnet-runtimeinfo
dotnet-runtimeinfo

    

   五、運行時和類別庫的提升

    1. RyuJIT的代碼質量提升

    可以參考這個鏈接:Performance Improvements in RyuJIT in .NET Core and .NET Framework

    2. GC垃圾回收

  • Card mark stealing – dotnet/coreclr #25986  Server GC (on different threads) can now work-steal while marking gen0/1 objects held live by older generation objects. This means that ephemeral GC pauses are shorter for scenarios where some GC threads took much longer to mark than others.  ServerGC 中標記階段的耗時更短了
  • Introducing Pinned Object Heap – dotnet/runtime #32283 — Adds the Pinned Object Heap (POH). This new heap (a peer to the Large Object Heap (LOH)) will allow the GC to manage pinned objects separately, and as a result avoid the negative effects of pinned objects on the generational heaps. 新增固定物件堆(POH),此新堆(與大物件堆(LOH)對等)將允許GC單獨管理固定物件,從而避免固定物件對堆的負面影響,
  • Allow allocating large object from free list while background sweeping SOH — Enabled LOH allocations using the free list while BGC is sweeping SOH. Previously this was only using end of segment space on LOH. This allowed for better heap usage.允許在后臺掃描SOH時從空閑串列中分配大物件
  • Background GC suspension fixes – dotnet/coreclr #27729 — Suspension fixes to reduce time for both BGC and user threads to be suspended. This reduces the total time it takes to suspend managed threads before a GC can happen. dotnet/coreclr #27578 also contributes to the same outcome. 掛起修復程式可減少BGC和用戶執行緒掛起的時間,這樣可以減少發生GC之前掛起托管執行緒所需的總時間,
  • Fix named cgroup handling in docker — Added support to read limits from named cgroups. Previously we only read from the global one. 修復了docker中命名cgroup處理的問題—添加了對從命名cgroups讀取限制的支持
  • Optimize vectorized sorting – dotnet/runtime #37159 — vectorized mark list sorting in GC which reduces the ephemeral GC pause time (also dotnet/runtime #40613). GC中的矢量化標記串列排序,減少了短暫的GC暫停時間
  • Generational aware analysis – dotnet/runtime #40322 — generational aware analysis that allows you to determine what old generation objects hold on to younger generation objects thus making them survive and contribute to ephemeral GC pause time.GC代感知分析,能夠確定哪些舊世代物件保留在年輕代物件上,從而使它們得以生存并有助于短暫的GC暫停時間,
  • Optimize decommitting GC heap memory pages – dotnet/runtime #35896 — optimized decommit, much better decommit logic and for Server GC took decommit completely out of the “stop the world” phase which reduced blocking GC pause time.優化了取消授權,更好的取消授權邏輯,對于Server GC,完全取消了“停止一切”階段的授權,從而減少了阻塞GC的暫停時間

     整體總結一下,Server GC延遲更低了,CPU消耗更少、性能更好了,

     3. Windows Arm64的支持

     .NET應用程式現在可以在Windows Arm64上本機運行,在.NET Core 3.0中添加的對Linux Arm64的支持(對glibc和musl的支持),使用.NET 5.0,可以在Windows Arm64設備(例如Surface Pro X)上開發和運行應用程式,也可以通過x86仿真在Windows Arm64上運行.NET Core和.NET Framework應用程式,但是本機運行Arm64具有更好的性能,

     同時,.NET 5.0 SDK當前在Windows Arm64上不包含Windows桌面組件-Windows表單和WPF,Windows Arm64上支持SDK,控制臺和ASP.NET Core應用程式,但Windows桌面組件不支持,

     4. Arm64性能優化

     .NET 5.0 中主要針對Arm64平臺做了以下優化:

  • 調整Arm64的JIT優化(示例)
  • 啟用并利用Arm64硬體內部函式(示例),
  • 調整Arm64庫中對性能至關重要的演算法(示例),

     更多詳細資訊,請參見在.NET 5.0中提高Arm64性能,

      5. P95 +延遲改進

      Stack Overflow的一位工程師Nick Craver最近分享了他們升級.NET Core后,對延遲的改進:

      問題頁面的展現時間中值從大約21毫秒(由于GC而有所增加)降至約15毫秒,

      第95個百分位數從?40ms下降到?30ms(相同測量),第99位從?60ms降至?45ms,

      .NET專案組的解讀是這樣的:固定物件一直是GC性能的長期挑戰,因為它們會加速(或導致)記憶體碎片,.NET 5.0為固定物件添加了新的GC堆,該固定物件堆是基于這樣的假設(以空間換時間),他們的存在會導致不相稱的性能挑戰極少數固定的物件,將固定的物件(尤其是由.NET庫作為實作細節創建的物件)移動到唯一的區域是有意義的,而垃圾回收代的GC堆幾乎沒有或沒有固定的物件,因此具有更高的性能,

       6. 分層編譯性能改進

       關于分層編譯,大家可以參考這個連接:https://devblogs.microsoft.com/dotnet/tiered-compilation-preview-in-net-core-2-1

       在.NET 5.0中對分層編譯進行了兩項重大改進,下面這2段有點復雜,也比較晦澀

      分層編譯的主要機制是呼叫計數,一旦某個方法被呼叫了n次,運行時就會要求JIT以更高的質量重新編譯該方法,從最早的性能分析中,發現采用計數機制太慢,但是沒有找到解決該問題的直接方法,.NET 5.0中改進了分層JIT編譯所使用的呼叫計數機制,以平滑啟動期間的性能,在過去的發行版中,已經發現在行程生命周期的前10到15秒鐘內,性能會發生不可預測的變化(主要是針對Web服務器),目前應該已經解決了,

     另一個性能挑戰是對具有回圈的方法使用分層編譯,根本的問題是,您可以使用帶有回圈多次的回圈的冷方法(僅呼叫一次或幾次; $ lt; n),我們稱這種病理情況為“冷方法”,熱回圈”,可以想象Main應用程式的方法會發生這種情況,結果,默認情況下,我們禁用了帶回圈方法的分層編譯,相反,使應用程式可以選擇使用帶回圈的分層編譯,在某些情況下看到了個位數的高性能改進后,PowerShell就是選擇執行此操作的應用程式,

     為了更好地解決回圈問題,.NET 實作了堆疊上替換(OSR),這類似于Java虛擬機具有的同名功能,OSR允許在方法執行程序中重新編譯當前正在運行的方法執行的代碼,而這些方法是“堆疊上”活動的,該功能目前處于試驗和選擇啟用狀態,并且僅在x64上可用,

     要使用OSR,必須啟用多個功能,目前.NET 5.0中沒有啟用OSR,這個功能尚未決定在生產環境中是否啟用,所以這個技術點,了解即可,

      7. JSON序列化 System.Text.Json

      .NET 5.0 對System.Text.Json進行了顯著改進,以提高性能和可靠性,同時API盡可能地和Newtonsoft.Json類似,它還包括對將JSON物件反序列化對record型別的支持,

      同時微軟提供了System.Text.Json替換Newtonsoft.Json的遷移指南,該指南詳細闡明了這兩個API之間的關系,

      如何從 Newtonsoft.Json 遷移到 System.Text.Json

      JsonSerializer.NET 5.0中的性能顯著提高,Stephen Toub在.NET 5中的性能改進中介紹了一些JsonSerializer改進,

  六、應用程式部署

    應用程式開發完成后,根據實際的需要,可能會部署到Web服務器,云服務或客戶端計算機,或者使用Azure DevOps或GitHub Actions之類的服務進行CI/CD,

    .NET 5.0專注于改善單個檔案應用程式,減小docker多階段構建的容器大小,并為使用.NET Core部署ClickOnce應用程式提供更好的支持,

    1. 容器

    與容器的互動協作非常重要,這個版本中添加了OpenTelemetry支持,可以從應用程式中捕獲分布式跟蹤和指標,dotnet-monitor是一個新工具,可以作為從.NET行程訪問診斷資訊的主要工具,特別是,我們已經開始構建dotnet-monitor的容器變體,您可以將其用作應用程式sidecar,同時,.NET專案組正在構建dotnet / tye,以提高微服務開發人員在開發和部署到Kubernetes環境中的效率,

   .NET運行時現在支持cgroup v2,這個API預計將在2020年以后成為與容器相關的重要API,Docker當前使用cgroup v1(.NET已支持),相比之下,cgroup v2比cgroup v1更簡單,更有效且更安全,.NET 5.0將在cgroup v2環境中正常作業,

   除了Nano Server,微軟還將發布Windows Server Core映像,努力減小Windows Server Core映像的大小,

    更小的體積、更低的成本、更快的啟動性能,.NET 5.0中將SDK映像重新建立在ASP.NET映像之上,而不是buildpack-deps,這樣可以顯著減小在多階段構建方案中提取的聚合映像的大小,

 

   

    2. 單檔案應用    

    單個檔案應用程式作為單個檔案發布和部署,該應用程式及其依賴項都包含在該檔案中,當應用程式運行時,依賴項直接從該檔案加載到記憶體中(不影響性能),

    在.NET 5.0中,單個檔案應用程式主要集中在Linux上,它們可以是框架相關的,也可以是獨立的,依賴于全域安裝的.NET運行時,依賴于框架的單個檔案應用程式可能很小,自包含的單檔案應用程式較大(由于帶有運行時),但不需要作為安裝前步驟就安裝.NET運行時,因此可以正常作業,通常,依賴框架對開發和企業環境有利,而對于ISV,獨立包含通常是更好的選擇,

    .NET Core 3.1制作了一個單檔案應用程式版本,它將二進制檔案打包到一個檔案中以進行部署,然后將這些檔案解壓縮到一個臨時目錄中以加載并執行它們,在某些情況下,這種方法會更好,但是希望為5.0構建的解決方案將是首選,并且會受到歡迎,  

    可以使用以下命令來生成單檔案應用程式:

框架相關的單檔案應用程式:
dotnet publish -r linux-x64 --self-contained false /p:PublishSingleFile=true
自包含的單檔案應用程式:
dotnet publish -r linux-x64 --self-contained true /p:PublishSingleFile=true

  3. ClickOnce

    ClickOnce一直是流行的.NET部署選項,歷史也比較悠久了,.NET Core 3.1和.NET 5.0 Windows應用程式現在支持它,   

    

     以上是.NET 5.0 發布后的技術梳理和整理,.NET 5.0作為.NET技術堆疊上近幾年一個重量級的里程碑,是All in one,統一平臺的第一個版本,現在有微軟的背書,微軟從.NET Preview 1就開始在自己的網站上運行.NET 5, (Bing.com、dot.net已升級并運行了數個月),同時早期的.NET Core版本可以直接升級到.NET 5. 所以大家可以放心使用的,也推薦大家逐步遷移升級到.NET 5.0.

    參考鏈接:

   https://devblogs.microsoft.com/dotnet/announcing-net-5-0?WT.mc_id=DT-MVP-5003918

   https://devblogs.microsoft.com/dotnet/performance-improvements-in-net-5/#json?WT.mc_id=DT-MVP-5003918

   https://blogs.windows.com/windowsdeveloper/2020/11/10/announcing-c-winrt-version-1-0-with-the-net-5-ga-release?WT.mc_id=DT-MVP-5003918

 

周國慶

2020/11/15

   

 

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/218562.html

標籤:.NET技术

上一篇:深度探秘.NET 5.0

下一篇:Redis分布式快取系列(二)- Redis中的String型別以及使用Redis解決訂單秒殺超賣問題

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • WebAPI簡介

    Web體系結構: 有三個核心:資源(resource),URL(統一資源識別符號)和表示 他們的關系是這樣的:一個資源由一個URL進行標識,HTTP客戶端使用URL定位資源,表示是從資源回傳資料,媒體型別是資源回傳的資料格式。 接下來我們說下HTTP. HTTP協議的系統是一種無狀態的方式,使用請求/ ......

    uj5u.com 2020-09-09 22:07:47 more
  • asp.net core 3.1 入口:Program.cs中的Main函式

    本文分析Program.cs 中Main()函式中代碼的運行順序分析asp.net core程式的啟動,重點不是剖析原始碼,而是理清程式開始時執行的順序。到呼叫了哪些實體,哪些法方。asp.net core 3.1 的程式入口在專案Program.cs檔案里,如下。ususing System; us ......

    uj5u.com 2020-09-09 22:07:49 more
  • asp.net網站作為websocket服務端的應用該如何寫

    最近被websocket的一個問題困擾了很久,有一個需求是在web網站中搭建websocket服務。客戶端通過網頁與服務器建立連接,然后服務器根據ip給客戶端網頁發送資訊。 其實,這個需求并不難,只是剛開始對websocket的內容不太了解。上網搜索了一下,有通過asp.net core 實作的、有 ......

    uj5u.com 2020-09-09 22:08:02 more
  • ASP.NET 開源匯入匯出庫Magicodes.IE Docker中使用

    Magicodes.IE在Docker中使用 更新歷史 2019.02.13 【Nuget】版本更新到2.0.2 【匯入】修復單列匯入的Bug,單元測驗“OneColumnImporter_Test”。問題見(https://github.com/dotnetcore/Magicodes.IE/is ......

    uj5u.com 2020-09-09 22:08:05 more
  • 在webform中使用ajax

    如果你用過Asp.net webform, 說明你也算是.NET 開發的老兵了。WEBform應該是2011 2013左右,當時還用visual studio 2005、 visual studio 2008。后來基本都用的是MVC。 如果是新開發的專案,估計沒人會用webform技術。但是有些舊版 ......

    uj5u.com 2020-09-09 22:08:50 more
  • iis添加asp.net網站,訪問提示:由于擴展配置問題而無法提供您請求的

    今天在iis服務器配置asp.net網站,遇到一個問題,記錄一下: 問題:由于擴展配置問題而無法提供您請求的頁面。如果該頁面是腳本,請添加處理程式。如果應下載檔案,請添加 MIME 映射。 WindowServer2012服務器,添加角色安裝完.netframework和iis之后,運行aspx頁面 ......

    uj5u.com 2020-09-09 22:10:00 more
  • WebAPI-處理架構

    帶著問題去思考,大家好! 問題1:HTTP請求和回傳相應的HTTP回應資訊之間發生了什么? 1:首先是最底層,托管層,位于WebAPI和底層HTTP堆疊之間 2:其次是 訊息處理程式管道層,這里比如日志和快取。OWIN的參考是將訊息處理程式管道的一些功能下移到堆疊下端的OWIN中間件了。 3:控制器處理 ......

    uj5u.com 2020-09-09 22:11:13 more
  • 微信門戶開發框架-使用指導說明書

    微信門戶應用管理系統,采用基于 MVC + Bootstrap + Ajax + Enterprise Library的技術路線,界面層采用Boostrap + Metronic組合的前端框架,資料訪問層支持Oracle、SQLServer、MySQL、PostgreSQL等資料庫。框架以MVC5,... ......

    uj5u.com 2020-09-09 22:15:18 more
  • WebAPI-HTTP編程模型

    帶著問題去思考,大家好!它是什么?它包含什么?它能干什么? 訊息 HTTP編程模型的核心就是訊息抽象,表示為:HttPRequestMessage,HttpResponseMessage.用于客戶端和服務端之間交換請求和回應訊息。 HttpMethod類包含了一組靜態屬性: private stat ......

    uj5u.com 2020-09-09 22:15:23 more
  • 部署WebApi隨筆

    一、跨域 NuGet參考Microsoft.AspNet.WebApi.Cors WebApiConfig.cs中配置: // Web API 配置和服務 config.EnableCors(new EnableCorsAttribute("*", "*", "*")); 二、清除默認回傳XML格式 ......

    uj5u.com 2020-09-09 22:15:48 more
最新发布
  • C#多執行緒學習(二) 如何操縱一個執行緒

    <a href="https://www.cnblogs.com/x-zhi/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2943582/20220801082530.png" alt="" /></...

    uj5u.com 2023-04-19 09:17:20 more
  • C#多執行緒學習(二) 如何操縱一個執行緒

    C#多執行緒學習(二) 如何操縱一個執行緒 執行緒學習第一篇:C#多執行緒學習(一) 多執行緒的相關概念 下面我們就動手來創建一個執行緒,使用Thread類創建執行緒時,只需提供執行緒入口即可。(執行緒入口使程式知道該讓這個執行緒干什么事) 在C#中,執行緒入口是通過ThreadStart代理(delegate)來提供的 ......

    uj5u.com 2023-04-19 09:16:49 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    <a href="https://www.cnblogs.com/huangxincheng/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/214741/20200614104537.png" alt="" /&g...

    uj5u.com 2023-04-18 08:39:04 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    一:背景 1. 講故事 前段時間協助訓練營里的一位朋友分析了一個程式卡死的問題,回過頭來看這個案例比較經典,這篇稍微整理一下供后來者少踩坑吧。 二:WinDbg 分析 1. 為什么會卡死 因為是表單程式,理所當然就是看主執行緒此時正在做什么? 可以用 ~0s ; k 看一下便知。 0:000> k # ......

    uj5u.com 2023-04-18 08:33:10 more
  • SignalR, No Connection with that ID,IIS

    <a href="https://www.cnblogs.com/smartstar/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/u36196.jpg" alt="" /></a>...

    uj5u.com 2023-03-30 17:21:52 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:15:33 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:13:31 more
  • C#遍歷指定檔案夾中所有檔案的3種方法

    <a href="https://www.cnblogs.com/xbhp/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/957602/20230310105611.png" alt="" /></a&...

    uj5u.com 2023-03-27 14:46:55 more
  • C#/VB.NET:如何將PDF轉為PDF/A

    <a href="https://www.cnblogs.com/Carina-baby/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2859233/20220427162558.png" alt="" />...

    uj5u.com 2023-03-27 14:46:35 more
  • 武裝你的WEBAPI-OData聚合查詢

    <a href="https://www.cnblogs.com/podolski/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/616093/20140323000327.png" alt="" /><...

    uj5u.com 2023-03-27 14:46:16 more