更新丨.NET 7 預覽版2 中的 ASP.NET Core

微軟技術棧發表於2022-04-08

.NET 7 預覽版2 現已推出,其中包括對 ASP.NET Core 的許多重大改進。
以下是此預覽版中新增內容的摘要:

  • 推斷來自服務的 API 控制器操作引數;
  • SignalR 集線器方法的依賴注入;
  • 為minimal API 提供端點描述和摘要;
  • 在最小的 API 中繫結來自標頭和查詢字串的陣列和 StringValue;
  • 自定義 cookie 同意值。

有關為 .NET 7 計劃的 ASP.NET Core 工作的更多詳細資訊,請參閱 GitHub 上的 .NET 7 的完整 ASP.NET Core 路線圖

開始使用

要開始使用 .NET 7 Preview 2 中的 ASP.NET Core,請安裝 .NET 7 SDK

如果您在 Windows 上使用 Visual Studio,我們建議安裝最新的 Visual Studio 2022 預覽版。Visual Studio for Mac 對 .NET 7 預覽的支援尚不可用,但即將推出。
要安裝最新的 .NET WebAssembly 構建工具,請從提升的命令提示符處執行以下命令:dotnet workload install wasm-tools。

升級現有專案

要將現有的 ASP.NET Core 應用從 .NET 7 Preview 1 升級到 .NET 7 Preview 2:

  • 將所有 Microsoft.AspNetCore. 包引用更新到 7.0.0-preview.2.
  • 將所有 Microsoft.Extensions. 包引用更新到 7.0.0-preview.2.

另請參閱 .NET 7 的 ASP.NET Core 中的重大更改的完整列表

推斷來自服務的 API 控制器操作引數

當型別配置為服務時,API 控制器操作的引數繫結現在通過依賴注入繫結引數。這意味著不再需要將 [FromServices] 屬性顯式應用於引數。

Services.AddScoped<SomeCustomType>();

[Route("[controller]")]
[ApiController]
public class MyController : ControllerBase
{
    // Both actions will bound the SomeCustomType from the DI container
    public ActionResult GetWithAttribute([FromServices]SomeCustomType service) => Ok();
    public ActionResult Get(SomeCustomType service) => Ok();
}

您可以通過設定 DisableImplicitFromServicesParameters 來禁用該功能:

Services.Configure<ApiBehaviorOptions>(options =>
{
     options.DisableImplicitFromServicesParameters = true;
})

SignalR 集線器方法的依賴注入

SignalR 集線器方法現在支援通過依賴注入 (DI) 注入服務。

Services.AddScoped<SomeCustomType>();

public class MyHub : Hub
{
    // SomeCustomType comes from DI by default now
    public Task Method(string text, SomeCustomType type) => Task.CompletedTask;
}

您可以通過設定 DisableImplicitFromServicesParameters 來禁用該功能:

services.AddSignalR(options =>
{
    options.DisableImplicitFromServicesParameters = true;
});

要顯式標記要從配置的服務繫結的引數,請使用 [FromServices] 屬性:

public class MyHub : Hub
{
    public Task Method(string arguments, [FromServices] SomeCustomType type);
}

為Minimal API 提供端點描述和摘要

Minimal API 現在支援使用用於 OpenAPI 規範生成的描述和摘要來註釋操作。您可以使用擴充套件方法在Minimal API 應用程式中為路由處理程式設定這些描述和摘要:

app.MapGet("/hello", () => ...)
  .WithDescription("Sends a request to the backend HelloService to process a greeting request.");

或者通過路由處理程式委託上的屬性設定描述或摘要:

app.MapGet("/hello", [EndpointSummary("Sends a Hello request to the backend")]() => ...)

在Minimal API 中繫結來自標頭和查詢字串的陣列和 StringValue

在此版本中,您現在可以將 HTTPS 標頭和查詢字串中的值繫結到原始型別陣列、字串陣列或 StringValues:

// Bind query string values to a primitive type array
// GET  /tags?q=1&q=2&q=3
app.MapGet("/tags", (int[] q) => $"tag1: {q[0]} , tag2: {q[1]}, tag3: {q[2]}")

// Bind to a string array
// GET /tags?names=john&names=jack&names=jane
app.MapGet("/tags", (string[] names) => $"tag1: {names[0]} , tag2: {names[1]}, tag3: {names[2]}")

// Bind to StringValues
// GET /tags?names=john&names=jack&names=jane
app.MapGet("/tags", (StringValues names) => $"tag1: {names[0]} , tag2: {names[1]}, tag3: {names[2]}")

您還可以將查詢字串或標頭值繫結到複雜型別的陣列,只要該型別具有 TryParse 實現,如下例所示。

// Bind query string values to a primitive type array
// GET  /tags?q=1&q=2&q=3
app.MapGet("/tags", (int[] q) => $"tag1: {q[0]} , tag2: {q[1]}, tag3: {q[2]}")

// Bind to a string array
// GET /tags?names=john&names=jack&names=jane
app.MapGet("/tags", (string[] names) => $"tag1: {names[0]} , tag2: {names[1]}, tag3: {names[2]}")

// Bind to StringValues
// GET /tags?names=john&names=jack&names=jane
app.MapGet("/tags", (StringValues names) => $"tag1: {names[0]} , tag2: {names[1]}, tag3: {names[2]}")

自定義 cookie 同意值

您現在可以使用新的 CookiePolicyOptions.ConsentCookieValue 屬性指定用於跟蹤使用者是否同意 cookie 使用策略的值。

感謝@daviddesmet 貢獻了這項改進!

請求有關 IIS 卷影複製的反饋

在 .NET 6 中,我們為 IIS 的 ASP.NET Core 模組 (ANCM) 新增了對影子複製應用程式程式集的實驗性支援。當 ASP.NET Core 應用程式在 Windows 上執行時,二進位制檔案被鎖定,因此無法修改或替換它們。您可以通過部署應用程式離線檔案來停止應用程式,但有時這樣做不方便或不可能。卷影複製允許在應用程式執行時通過複製程式集來更新應用程式程式集。

您可以通過在 web.config 中自定義 ANCM 處理程式設定來啟用卷影複製:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <handlers>
      <remove name="aspNetCore"/>
      <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified"/>
    </handlers>
    <aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" stdoutLogEnabled="false" stdoutLogFile=".logsstdout">
      <handlerSettings>
        <handlerSetting name="experimentalEnableShadowCopy" value="true" />
        <handlerSetting name="shadowCopyDirectory" value="../ShadowCopyDirectory/" />
      </handlerSettings>
    </aspNetCore>
  </system.webServer>
</configuration>

我們正在研究使 IIS 中的卷影複製成為 .NET 7 中 ASP.NET Core 的一項功能,並且我們正在尋求有關該功能是否滿足使用者要求的更多反饋。如果您將 ASP.NET Core 部署到 IIS,請嘗試使用卷影複製並在 GitHub 上與我們分享您的反饋

總 結

我們希望您喜歡 .NET 7 中的 ASP.NET Core 預覽版。通過在 GitHub 上提交問題,讓我們知道您對這些新改進的看法。

感謝您試用 ASP.NET Core!

點選獲取ASP.NET Core文件新增內容

相關文章