主頁 > .NET開發 > [翻譯] ASP.NET Core 3.0 的新增功能

[翻譯] ASP.NET Core 3.0 的新增功能

2020-09-24 01:15:12 .NET開發

ASP.NET Core 3.0 的新增功能

全文翻譯自微軟官方檔案英文版 What's new in ASP.NET Core 3.0

本文重點介紹了 ASP.NET Core 3.0 中最重要的更改,并提供相關檔案的連接,

目錄
  • ASP.NET Core 3.0 的新增功能
    • Blazor
      • Blazor Server
      • Blazor WebAssembly (預覽)
      • Razor 組件
    • gRPC
    • SignalR
      • 新的 JSON 序列化
    • 新的 Razor 指令
    • 證書與 Kerberos 身份驗證
    • 模板變更
    • 通用主機
      • 主機配置
      • Startup 建構式注入的更改
    • Kestrel
    • 默認啟用 HTTP/2
    • 請求計數器
    • 終結點路由
    • 運行狀況檢查
    • HttpContext 上的管道
    • IIS 中改進了的錯誤報告
    • 服務角色服務和輔助角色 SDK
    • Forwarded 標頭中間件的改進
    • 性能提升
    • ASP.NET Core 3.0 僅可在 .NET Core 3.0 上運行
    • 使用 ASP.NET Core 共享框架
    • 從 ASP.NET Core 共享框架中移除的程式集

Blazor

Blazor 是 ASP.NET Core 中的一個新的框架,用于使用 .NET 構建互動式的客戶端 Web UI:

  • 使用 C# 而不是 JavaScript 創建豐富的互動式 UI,
  • 共享用 .NET 撰寫的服務器端和客戶端應用程式邏輯,
  • 將 UI 渲染為 HTML 和 CSS,以提供廣泛的瀏覽器支持,包括移動瀏覽器,

Blazor 框架支持的場景:

  • 可重用的 UI 組件(Razor 組件)
  • 客戶端路由
  • 組件布局
  • 對依賴注入的支持
  • 表單與驗證
  • 使用 Razor 類別庫構建組件庫
  • JavaScript 互操作

有關更多資訊,請參閱:ASP.NET Core 中的 Blazor 簡介,

Blazor Server

Blazor 將組件渲染邏輯與 UI 更新的邏輯進行了解耦,Blazor Server 支持在服務器上的 ASP.NET Core 應用程式中承載 Razor 組件,UI 的更新通過一個 SignalR 連接進行處理,Blazor Server 在 ASP.NET Core 3.0 中受支持,

Blazor WebAssembly (預覽)

Blazor 應用程式也可以使用基于 WebAssembly 的 .NET 運行時直接在瀏覽器中運行,Blazor WebAssembly 在 ASP.NET Core 3.0 中處于預覽狀態,且不受支持,未來的 ASP.NET Core 版本將支持 Blazor WebAssembly,

Razor 組件

Blazor 應用程式是由組件 (components) 構建而成的,組件是自包含的用戶界面元素,例如頁面、對話框或者表單等,組件是普通的 .NET 類,用于定義 UI 呈現邏輯和客戶端事件處理程式,您可以創建沒有 JavaScript 的富互動式 Web 應用程式,

Blazor 中的組件通常使用 Razor 語法撰寫,它是 HTML 和 C# 的自然融合,Razor 組件與 Razor Pages(頁面)和 MVC 視圖 (view) 相似,因為它們都使用 Razor,與基于“請求-回應”模型的頁面與視圖不同,組件專門用于處理 UI 合成,

gRPC

gRPC:

  • 是一種流行的高性能 RPC(遠程程序呼叫)框架,
  • 為 API 開發提供了一種“契約優先“的方式,
  • 使用各種現代的技術,例如:
    • 通過 HTTP/2 傳輸
    • 使用 Protocol Buffers 作為介面描述語言
    • 二進制序列化格式
  • 提供以下功能:
    • 身份驗證
    • 雙向的資料流與流程控制
    • 取消與超時

ASP.NET Core 3.0 中的 gRPC 功能包括:

  • Grpc.AspNetCore — 一個用于承載 gRPC 服務的 ASP.NET Core 框架,ASP.NET Core 上的 gRPC 能夠與日志記錄、依賴注入 (DI) 身份驗證和授權等標準的 ASP.NET Core 功能集成在一起,
  • Grpc.Net.Client — 一個面向 .NET Core,構建在 HttpClient 上的 gRPC 客戶端,
  • Grpc.Net.ClientFactory — 用于將 gRPC 客戶端與 HttpClientFactory 集成,

有關更多資訊,參見:ASP.NET Core 上 gRPC 的簡介

SignalR

請參見更新 Signal 代碼以獲取遷移說明,SignalR 現在使用 System.Text.Json 來序列化/反序列化 JSON 訊息,有關還原為基于 Newtonsoft.Json 的序列化程式的說明,請參閱切換到 Newtonsoft.Json,

在 SignalR 的 JavaScript 和 .NET 客戶端中,添加了對自動重新連接的支持,默認情況下,客戶端嘗試自動重新連接,并在 2, 10 和 30 秒后(如有必要)重試,如果客戶端成功重新連接,它將受到一個新的連接 ID,自動重新連接是選擇性加入的:

const connection = new signalR.HubConnectionBuilder()
    .withUrl("/chatHub")
    .withAutomaticReconnect()
    .build();

可以通過傳遞基于毫秒的持續時間陣列來指定重新連接間隔:

.withAutomaticReconnect([0, 3000, 5000, 10000, 15000, 30000])
//.withAutomaticReconnect([0, 2000, 10000, 30000]) 默認時間間隔

可以傳入自定義實作以完全控制重新連接間隔,

如果在上次重新連接間隔之后重新連接失敗,則:

  • 客戶端認為連接已離線,
  • 客戶端停止嘗試重新連接,

為了在連接中斷時提供 UI 反饋,SignalR 客戶端 API 已擴展為包括以下事件處理程式:

  • onreconnecting: 為開發人員提供了禁用 UI 或告知用戶該應用程式處于脫機狀態的機會,
  • onreconnected: 重新建立連接后,使開發人員有機會更新 UI,

以下代碼在嘗試連接時使用 onreconnecting 更新 UI:

connection.onreconnecting((error) => {
    const status = `Connection lost due to error "${error}". Reconnecting.`;
    document.getElementById("messageInput").disabled = true;
    document.getElementById("sendButton").disabled = true;
    document.getElementById("connectionStatus").innerText = status;
});

以下代碼在連接恢復時使用 onreconnected 更新 UI:

connection.onreconnected((connectionId) => {
    const status = `Connection reestablished. Connected.`;
    document.getElementById("messageInput").disabled = false;
    document.getElementById("sendButton").disabled = false;
    document.getElementById("connectionStatus").innerText = status;
});

當 hub 方法需要授權時,SignalR 3.0 及更高版本為授權處理程式提供自定義資源,該資源是 HubInvocationContext 的實體,HubInvocationContext 包括:

  • HubCallerContext
  • 正在呼叫的 hub 方法的名稱,
  • hub 方法的引數,

考慮以下聊天室應用程式示例,該應用程式允許通過 Azure Active Directory 進行多個組織登錄, 具有 Microsoft 賬戶的任何人都可以登錄聊天,但只有所屬組織的成員可以禁止用戶或查看用戶的聊天記錄, 該應用可以限制特定用戶的某些功能,

public class DomainRestrictedRequirement :
    AuthorizationHandler<DomainRestrictedRequirement, HubInvocationContext>,
    IAuthorizationRequirement
{
    protected override Task HandleRequirementAsync(
        AuthorizationHandlerContext context,
        DomainRestrictedRequirement requirement,
        HubInvocationContext resource)
    {
        if (context.User?.Identity?.Name == null)
        {
            return Task.CompletedTask;
        }

        if (IsUserAllowedToDoThis(
                resource.HubMethodName,
                context.User.Identity.Name))
        {
            context.Succeed(requirement);
        }

        return Task.CompletedTask;
    }

    private bool IsUserAllowedToDoThis(string hubMethodName, string currentUsername)
    {
        if (hubMethodName.Equals("banUser",
            StringComparison.OrdinalIgnoreCase))
        {
            return currentUsername.Equals(
                "[email protected]",
                StringComparison.OrdinalIgnoreCase);
        }

        return currentUsername.EndsWith(
                "@jabbr.net",
                StringComparison.OrdinalIgnoreCase));
    }
}

在前面的代碼中,DomainRestrictedRequirement 用作自定義 IAuthorizationRequirement,由于傳遞了 HubInvocationContext 資源,因此內部邏輯可以:

  • 檢查正在呼叫 hub 的背景關系,
  • 決定是否允許用戶執行特定的 hub 方法,

可以使用策略名稱來修飾各個 hub 方法,代碼會在運行時進行檢查,當客戶端嘗試呼叫各個 hub 方法時,DomainRestrictedRequirement 處理程式將會運行并控制對方法的訪問,基于 DomainRestrictedRequirement 控制訪問的方式:

  • 所有已登錄用戶都可以呼叫 SendMessage 方法,
  • 只有使用 @jabbr.net 電子郵件地址登錄的用戶才能查看用戶的歷史記錄,
  • 只有 [email protected] 可以禁止用戶進入聊天室,
[Authorize]
public class ChatHub : Hub
{
    public void SendMessage(string message)
    {
    }

    [Authorize("DomainRestricted")]
    public void BanUser(string username)
    {
    }

    [Authorize("DomainRestricted")]
    public void ViewUserHistory(string username)
    {
    }
}

創建 DomainRestricted 策略可能涉及:

  • Startup.cs 中添加新策略,
  • 將自定義的 DomainRestrictedRequirement 需求作為引數提供,
  • 使用授權中間件注冊 DomainRestricted
services
    .AddAuthorization(options =>
    {
        options.AddPolicy("DomainRestricted", policy =>
        {
            policy.Requirements.Add(new DomainRestrictedRequirement());
        });
    });

SignalR hub 使用終結點路由,SignalR hub 連接先前已顯式地完成:

app.UseSignalR(routes =>
{
    routes.MapHub<ChatHub>("hubs/chat");
});

在以前的版本中,開發人員需要在各個不同的位置啟用控制器、Razor 頁面和 SignalR hub,顯式的連接導致一系列幾乎相同的路由片段:

app.UseSignalR(routes =>
{
    routes.MapHub<ChatHub>("hubs/chat");
});

app.UseRouting(routes =>
{
    routes.MapRazorPages();
});

SignalR 3.0 hub 可以通過終結點路由進行路由,使用終結點路由,通常可以在 UseRouting 中配置所有的路由:

app.UseRouting(routes =>
{
    routes.MapRazorPages();
    routes.MapHub<ChatHub>("hubs/chat");
});

ASP.NET Core 3.0 SignalR 添加了:

客戶端到服務器的流,通過客戶端到服務器的流傳輸,服務器端方法可以采用 IAsyncEnumerable<T> 或者 ChannelReader<T> 的實體,在以下 C# 實體中,hub 上的 UploadStream 方法將從客戶端接收字串流:

public async Task UploadStream(IAsyncEnumerable<string> stream)
{
    await foreach (var item in stream)
    {
        // 處理流中的內容
    }
}

.NET 客戶端應用程式可以將一個 IAsyncEnumerable<T> 或者 ChannelReader<T> 的實體作為上述 UploadStream hub 方法的 stream 引數進行傳遞,

for 回圈完成,且本地函式退出之后,將流完成發送(After the for loop has completed and the local function exits, the stream completion is sent):

async IAsyncEnumerable<string> clientStreamData()
{
    for (var i = 0; i < 5; i++)
    {
        var data = https://www.cnblogs.com/vxchin/p/await FetchSomeData();
        yield return data;
    }
}

await connection.SendAsync("UploadStream", clientStreamData());

JavaScript 客戶端應用將 SignalR Subject (或者一個 RxJS Subject) 用于上述 UploadStream hub 方法的 stream 引數,

let subject = new signalR.Subject();
await connection.send("StartStream", "MyAsciiArtStream", subject);

當 JavaScript 代碼捕獲到字串并準備將其發送到服務器時,它可以使用 subject.next 方法來處理字串,

subject.next("example");
subject.complete();

使用類似前面兩個代碼段的代碼,可以創建實時流式傳輸體驗,

新的 JSON 序列化

現在默認情況下,ASP.NET Core 3.0 使用 System.Text.Json 進行 JSON 序列化:

  • 異步讀取和寫入 JSON,
  • 針對 UTF-8 文本進行了優化,
  • 通常會比 Newtonsoft.Json 具有更高的性能,

要將 Json.NET 添加到 ASP.NET Core 3.0 請參閱添加基于 Newtonsoft.Json 的 JSON 格式支持,

新的 Razor 指令

以下串列包含了新的 Razor 指令:

  • @attribute — @attribute 指令將給定屬性應用于生成頁面或者視圖的類,例如:@attribute [Authorize]
  • @implements — @implements 指令為生成的類實作一個介面,例如:@implements IDisposable

證書與 Kerberos 身份驗證

證書身份驗證要求:

  • 配置服務器以接收證書,
  • Startup.Configure 中添加身份驗證中間件,
  • Startup.ConfigureServices 中添加證書身份驗證服務,
public void ConfigureServices(IServiceCollection services)
{
    services.AddAuthentication(
        CertificateAuthenticationDefaults.AuthenticationScheme)
            .AddCertificate();
    // 其他服務配置已移除,
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseAuthentication();
    // 其他應用配置已移除,
}

證書身份驗證的選項 (Options) 提供以下功能:

  • 接受自簽名證書,
  • 檢查證書吊銷,
  • 檢查提供的證書是否具有正確的使用標志,

默認的用戶主體 (user principal) 是根據證書屬性構建的,用戶主體包含一個事件,通過相應該事件,可以補充或者替換該主體,有關更多資訊,請參見在 ASP.NET Core 中配置證書身份驗證,

Windows 身份驗證 已擴展到了 Linux 和 macOS 上,在以前的版本中,Windows 身份驗證僅限于 IIS 和 HttpSys,在 ASP.NET Core 3.0 中,Kestrel 能夠在 Windows, Linux 和 macOS 上為加入了 Windows 域的主機使用 Negotiate(協商), Kerberos 和 NTLM,Kestrel 對這些身份驗證架構的支持由 Microsoft.AspNetCore.Authentication.Negotiate NuGet 包提供,與其他身份驗證服務一樣,在用用程式范圍內配置身份驗證,然后配置服務:

public void ConfigureServices(IServiceCollection services)
{
    services.AddAuthentication(NegotiateDefaults.AuthenticationScheme)
        .AddNegotiate();
    // 其他服務配置已移除,
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseAuthentication();
    // 其他應用配置已移除,
}

主機要求:

  • Windows 主機必須將服務主體名稱 (SPN) 添加到承載該應用程式的用戶賬戶中,
  • Linux 和 macOS 主機必須加入域,
    • 必須為 Web 行程創建 SPN,
    • 必須在主機上生成和配置密鑰表檔案,

有關更多資訊,請參見在 ASP.NET Core 中配置 Windows 身份驗證,

模板變更

Web UI 模板(Razor Pages, 帶有控制器和視圖的 MVC)已洗掉以下內容:

  • “Cookie 同意” UI 不再包含在內,若要在 ASP.NET Core 3.0 模板生成的應用程式中啟用“Cookie 同意”功能,請參閱 ASP.NET Core 中的常規資料保護法規 (GDPR) 支持,
  • 現在,腳本和相關的靜態資產被作為本地檔案參考,而不再使用 CDN,有關更多資訊,請參見腳本和相關的靜態資產現在被作為本地檔案參考而不再使用 CDN (aspnet/AspNetCore.Docs #14350),

Angular 模板已更新為使用 Angular 8,

默認情況下,Razor 類別庫 (RCL) 模板默認為用于 Razor 組件開發,Visual Studio 中新的模板選項為頁面和視圖提供模板支持,在命令列中從模板創建 RCL 時,請傳入 -support-pages-and-views 選項 (dotnet new razorclasslib -support-pages-and-views),

通用主機

ASP.NET Core 3.0 模板使用 .NET 通用主機,以前的版本使用 WebHostBuilder,使用 .NET Core 通用主機(HostBuilder),可以更好地將 ASP.NET Core 應用程式與其他非特定與 Web 的服務器方案集成,有關更多資訊,請參見 HostBuilder 替換 WebHostBuilder,

主機配置

在發布 ASP.NET Core 3.0 之前,帶有 ASPNETCORE_ 前綴的環境變數會被加載,用于 Web 主機的主機配置,在 3.0 中,AddEvironmentVariables 用于加載帶有 DOTNET_ 以前追的環境變數,以使用 CreateDefaultBuilder 進行主機配置,

Startup 建構式注入的更改

通用主機僅支持一下型別的 Startup 建構式注入:

  • IHostEnvironment
  • IWebHostEnvironment
  • IConfiguration

仍然可以將所有服務以引數的形式直接注入 Startup.Configure 方法,參見 通用主機限制 Startup 建構式注入 (aspnet/Announcements #353).

Kestrel

  • 為了遷移到通用主機,Kestrel 配置已更新,在 3.0 中,Kestrel 在 ConfigureWebHostDefaults 提供的 Web 主機構建器 (host builder) 上進行配置,
  • 連接配接器 (Connection Adapter) 已從 Kestrel 中洗掉,并由連接中間件代替 (Connection Middleware),該中間件類似于 ASP.NET Core 管道中的 HTTP 中間件,但用于較低級別的連接,
  • Kestrel 傳輸層已在 Connections.Abstractions 中作為公共介面公開,
  • 標頭 (header) 和尾部 (trailer) 之間的歧義已通過將尾部標頭 (trailing header) 移動到新的集合來解決,
  • 同步 IO API(例如 HttpRequest.Body.Read)是引起執行緒饑餓進而導致程式崩潰的常見原因,在 3.0 中,默認情況下 AllowSynchronousIO 被禁用,

有關更多資訊,請參見Kestrel - 從 ASP.NET Core 2.2 遷移到 3.0,

默認啟用 HTTP/2

默認情況下,Kestrel 中為 HTTPS 端點啟用了 HTTP/2,當作業系統支持時,對 IIS 或者 HTTP.sys 的 HTTP/2 的支持將被啟用,

請求計數器

Hosting EventSource (Microsoft.AspNetCore.Hosting) 發出與傳入請求有關的以下 EventCounter:

  • requests-per-second
  • total-requests
  • current-requests
  • failed-requests

終結點路由

終結點路由得到了增強,該路由使各種框架(例如 MVC)可以與中間件更好地協同作業:

  • 中間件和終結點的順序可以在 Startup.Configure 的請求處理管道中進行配置,
  • 終結點和中間件與其他基于 ASP.NET Core 的技術(例如運行狀況檢查)進行良好的編排,
  • 終結點可以在中間件和 MVC 中實作各種策略,例如 CORS 或者授權等,
  • 過濾器和特性 (attribute) 可以被放置在控制器的方法上,

有關更多資訊,請參見 ASP.NET Core 中的路由,

運行狀況檢查

運行狀況檢查通過通用主機使用終結點路由,在 Startup.Configure 中,使用終結點 URL 或者相對路徑,在終結點構建器上呼叫 MapHealthChecks

app.UseEndpoints(endpoints =>
{
    endpoints.MapHealthChecks("/health");
});

運行狀況檢查終結點可以:

  • 指定一個或多個允許的主機/埠,
  • 要求授權,
  • 要求 CORS,

有關更多資訊,請參見以下文章:

  • 運行狀況檢查 - 從 ASP.NET Core 2.2 遷移到 3.0
  • ASP.NET Core 中的運行狀況檢查

HttpContext 上的管道

現在可以使用 System.IO.Pipelines API 讀取請求正文并寫入回應正文,HttpRequest.BodyReader 屬性提供了一個 PipeReader,可以用于讀取請求正文;HttpResponse.BodyWriter 屬性提供了一個 PipeWriter,可以用于寫入回應正文,HttpRequest.BodyReaderHttpRequest.Body 流的相似物; HttpResponse.BodyWriterHttpResponse.Body 流的相似物,

IIS 中改進了的錯誤報告

現在,在 IIS 中托管 ASP.NET Core 應用程式時的啟動錯誤會生成更豐富的診斷資料,這些錯誤會在適用的情況下使用堆疊跟蹤,報告給 Windows 事件日志,此外,所有的警告、錯誤和未處理的例外,都會記錄到 Windows 事件日志中,

服務角色服務和輔助角色 SDK

.NET Core 3.0 引入了新的輔助角色服務 (Worker Service) 應用模板,該模板是在 .NET Core 中撰寫長時間運行的服務的起點,

有關更多資訊,請參見:

  • 作為 Windows 服務運行的 .NET Core 輔助角色 (.NET Core Workers as Windows Services)
  • 在 ASP.NET Core 中使用托管服務實作后臺任務
  • 在 Windows 服務中承載 ASP.NET Core

Forwarded 標頭中間件的改進

在早期版本的 ASP.NET Core 中,應用在部署到 Azure Linux 或者除 IIS 之外的任何反向代理之后,呼叫 UseHsts 和 UseHttpsRedirection 都是有問題的,轉發 Linux 和非 IIS 反向代理的方案中介紹了以前版本的修復方式,

此場景已在 ASP.NET Core 3.0 中修復,當 ASPNETCORE_FORWARDEDHEADERS_ENABLED 環境變數設定為 true 時,主機將啟用 Forwarded 標頭中間件,在 ASP.NET Core 的容器鏡像中,ASPNETCORE_FORWARDEDHEADERS_ENABLED 已被設定為 true

性能提升

ASP.NET Core 3.0 包括許多改進,可以減少記憶體使用并提高吞吐量:

  • 在將內置的依賴注入容器用于 scoped 服務時,減少記憶體的使用量,
  • 減少整個框架的記憶體分配,包括中間件的各類場景和路由,
  • 減少 WebSocket 連接的記憶體使用量,
  • 減少 HTTPS 連接的記憶體使用量,并提高吞吐量,
  • 新的、經過優化的、完全異步的 JSON 序列化器,
  • 減少表單 (form) 決議的記憶體使用量,并提高吞吐量,

ASP.NET Core 3.0 僅可在 .NET Core 3.0 上運行

從 ASP.NET Core 3.0開始,.NET Framework 不再是受支持的目標框架,以 .NET Framework 為目標的專案可以繼續通過使用 .NET Core 2.1 LTS 版本在完全受支持的狀態下運行,絕大多數與 ASP.NET Core 2.1.x 相關的軟體包,都將在 .NET Core 2.1 的三年長期支持期內獲得支持,(Most ASP.NET Core 2.1.x related packages will be supported indefinitely, beyond the 3 year LTS period for .NET Core 2.1.)

有關遷移的更多資訊,請參見 將代碼從 .NET Framework 移植到 .NET Core,

使用 ASP.NET Core 共享框架

Microsoft.AspNetCore.App 元包中包含的 ASP.NET Core 3.0 共享框架 (shared framework) 不再需要專案檔案中的顯式 <PackageReference /> 元素,在專案檔案中使用 Microsoft.NET.Sdk.Web SDK 時,將自動參考共享框架:

<Project Sdk="Microsoft.NET.Sdk.Web">

從 ASP.NET Core 共享框架中移除的程式集

從 ASP.NET Core 3.0 共享程式集中移除的最值得注意的程式集是:

  • Newtonsoft.Json (Json.NET),要將 Json.NET 添加到 ASP.NET Core 3.0,請參閱 添加基于 Newtonsoft.Json 的 JSON 格式支持,ASP.NET Core 3.0 引入了 System.Text.Json 來讀寫 JSON,有關更多資訊,請參閱本檔案中新的 JSON 序列化,
  • Entity Framework Core

有關共享框架中所移除程式集的完整串列,請參閱 從 Microsoft.AspNetCore.App 3.0 中移除的程式集,有關進行此修改的動機,更多資訊請參閱Microsoft.AspNetCore.App 在 3.0 中的破壞性變更 和 ASP.NET Core 3.0 中的更改初探,

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

標籤:.NET Core

上一篇:NetCore 統一處理 webapi 回傳null 轉為“”

下一篇:怎么用C#實作符號的閃動效果

標籤雲
其他(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