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

MicrosoftReactor發表於2022-04-15

.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;
})

您可以通過設定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!

相關文章