Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/check-for-build-warnings.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ jobs:
with:
egress-policy: audit

- uses: dotnet/docs-tools/actions/status-checker@5e8bcc78465d45a7544bba56509a1a69922b6a5a # main
- uses: dotnet/docs-tools/actions/status-checker@main
with:
repo_token: ${{ secrets.GITHUB_TOKEN }}
docs_path: "docs"
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/cleanrepo-orphaned-articles.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ jobs:
# Call clean repo
- name: Clean repo
id: clean-repo-step
uses: dotnet/docs-tools/cleanrepo@b1ebc174a5bbd18e6904a12069a8fae2c5cc3b6f
uses: dotnet/docs-tools/cleanrepo@main
with:
function: "FindOrphanedArticles"
docfx_directory: "."
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/cleanrepo-orphaned-images.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ jobs:
# Call clean repo
- name: Clean repo
id: clean-repo-step
uses: dotnet/docs-tools/cleanrepo@b1ebc174a5bbd18e6904a12069a8fae2c5cc3b6f
uses: dotnet/docs-tools/cleanrepo@main
with:
function: "FindOrphanedImages"
docfx_directory: "."
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/cleanrepo-orphaned-includes.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ jobs:
# Call clean repo
- name: Clean repo
id: clean-repo-step
uses: dotnet/docs-tools/cleanrepo@b1ebc174a5bbd18e6904a12069a8fae2c5cc3b6f
uses: dotnet/docs-tools/cleanrepo@main
with:
function: "FindOrphanedIncludes"
docfx_directory: "."
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/cleanrepo-orphaned-snippets.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ jobs:
# Call clean repo
- name: Clean repo
id: clean-repo-step
uses: dotnet/docs-tools/cleanrepo@b1ebc174a5bbd18e6904a12069a8fae2c5cc3b6f
uses: dotnet/docs-tools/cleanrepo@main
with:
function: "FindOrphanedSnippets"
docfx_directory: "."
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/cleanrepo-redirect-hops.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ jobs:
# Call clean repo
- name: Clean repo
id: clean-repo-step
uses: dotnet/docs-tools/cleanrepo@b1ebc174a5bbd18e6904a12069a8fae2c5cc3b6f
uses: dotnet/docs-tools/cleanrepo@main
with:
function: "RemoveRedirectHops"
docfx_directory: "."
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/cleanrepo-relative-links.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ jobs:
# Call clean repo
- name: Clean repo
id: clean-repo-step
uses: dotnet/docs-tools/cleanrepo@b1ebc174a5bbd18e6904a12069a8fae2c5cc3b6f
uses: dotnet/docs-tools/cleanrepo@main
with:
function: "ReplaceWithRelativeLinks"
docfx_directory: "."
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/cleanrepo-replace-redirects.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ jobs:
# Call clean repo
- name: Clean repo
id: clean-repo-step
uses: dotnet/docs-tools/cleanrepo@b1ebc174a5bbd18e6904a12069a8fae2c5cc3b6f
uses: dotnet/docs-tools/cleanrepo@main
with:
function: "ReplaceRedirectTargets"
docfx_directory: "."
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/dependabot-bot.yml
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ jobs:
# Run the .NET dependabot-bot tool
- name: dependabot-bot
id: dependabot-bot
uses: dotnet/docs-tools/actions/dependabot-bot@5e8bcc78465d45a7544bba56509a1a69922b6a5a # main
uses: dotnet/docs-tools/actions/dependabot-bot@main
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/quest-bulk.yml
Original file line number Diff line number Diff line change
Expand Up @@ -37,15 +37,15 @@ jobs:
- name: Azure OpenID Connect
id: azure-oidc-auth
uses: dotnet/docs-tools/.github/actions/oidc-auth-flow@5e8bcc78465d45a7544bba56509a1a69922b6a5a # main
uses: dotnet/docs-tools/.github/actions/oidc-auth-flow@main
with:
client-id: ${{ secrets.CLIENT_ID }}
tenant-id: ${{ secrets.TENANT_ID }}
audience: ${{ secrets.OSMP_API_AUDIENCE }}

- name: bulk-sequester
id: bulk-sequester
uses: dotnet/docs-tools/actions/sequester@5e8bcc78465d45a7544bba56509a1a69922b6a5a # main
uses: dotnet/docs-tools/actions/sequester@main
env:
ImportOptions__ApiKeys__GitHubToken: ${{ secrets.GITHUB_TOKEN }}
ImportOptions__ApiKeys__QuestKey: ${{ secrets.QUEST_KEY }}
Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/quest.yml
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ jobs:

- name: Azure OpenID Connect
id: azure-oidc-auth
uses: dotnet/docs-tools/.github/actions/oidc-auth-flow@5e8bcc78465d45a7544bba56509a1a69922b6a5a # main
uses: dotnet/docs-tools/.github/actions/oidc-auth-flow@main
with:
client-id: ${{ secrets.CLIENT_ID }}
tenant-id: ${{ secrets.TENANT_ID }}
Expand All @@ -51,7 +51,7 @@ jobs:
- name: manual-sequester
if: ${{ github.event_name == 'workflow_dispatch' }}
id: manual-sequester
uses: dotnet/docs-tools/actions/sequester@5e8bcc78465d45a7544bba56509a1a69922b6a5a # main
uses: dotnet/docs-tools/actions/sequester@main
env:
ImportOptions__ApiKeys__GitHubToken: ${{ secrets.GITHUB_TOKEN }}
ImportOptions__ApiKeys__AzureAccessToken: ${{ steps.azure-oidc-auth.outputs.access-token }}
Expand All @@ -67,7 +67,7 @@ jobs:
- name: auto-sequester
if: ${{ github.event_name != 'workflow_dispatch' }}
id: auto-sequester
uses: dotnet/docs-tools/actions/sequester@5e8bcc78465d45a7544bba56509a1a69922b6a5a # main
uses: dotnet/docs-tools/actions/sequester@main
env:
ImportOptions__ApiKeys__GitHubToken: ${{ secrets.GITHUB_TOKEN }}
ImportOptions__ApiKeys__AzureAccessToken: ${{ steps.azure-oidc-auth.outputs.access-token }}
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/version-sweep.yml
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ jobs:

- name: .NET version updater
id: dotnet-version-updater
uses: dotnet/docs-tools/actions/dotnet-version-updater@5e8bcc78465d45a7544bba56509a1a69922b6a5a # main
uses: dotnet/docs-tools/actions/dotnet-version-updater@main
with:
support: ${{ github.event.inputs.support }}
token: ${{ secrets.GITHUB_TOKEN }}
4 changes: 2 additions & 2 deletions .github/workflows/whats-new.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,13 +36,13 @@ jobs:

- name: Azure OpenID Connect
id: azure-oidc-auth
uses: dotnet/docs-tools/.github/actions/oidc-auth-flow@5e8bcc78465d45a7544bba56509a1a69922b6a5a # main
uses: dotnet/docs-tools/.github/actions/oidc-auth-flow@main
with:
client-id: ${{ secrets.CLIENT_ID }}
tenant-id: ${{ secrets.TENANT_ID }}
audience: ${{ secrets.OSMP_API_AUDIENCE }}

- uses: dotnet/docs-tools/WhatsNew.Cli@5e8bcc78465d45a7544bba56509a1a69922b6a5a # main
- uses: dotnet/docs-tools/WhatsNew.Cli@main
env:
GitHubKey: ${{ secrets.GITHUB_TOKEN }}
AZURE_ACCESS_TOKEN: ${{ steps.azure-oidc-auth.outputs.access-token }}
Expand Down
2 changes: 1 addition & 1 deletion docs/azure/includes/dotnet-all.md
Original file line number Diff line number Diff line change
Expand Up @@ -531,7 +531,7 @@
| Microsoft.Azure.Functions.Worker.Extensions.Rpc | NuGet [1.0.1](https://www.nuget.org/packages/Microsoft.Azure.Functions.Worker.Extensions.Rpc/1.0.1) | | |
| Microsoft.Azure.Functions.Worker.Extensions.SendGrid | NuGet [3.0.3](https://www.nuget.org/packages/Microsoft.Azure.Functions.Worker.Extensions.SendGrid/3.0.3) | | |
| Microsoft.Azure.Functions.Worker.Extensions.ServiceBus | NuGet [5.22.0](https://www.nuget.org/packages/Microsoft.Azure.Functions.Worker.Extensions.ServiceBus/5.22.0) | | |
| Microsoft.Azure.Functions.Worker.Extensions.SignalRService | NuGet [1.15.0](https://www.nuget.org/packages/Microsoft.Azure.Functions.Worker.Extensions.SignalRService/1.15.0) | | |
| Microsoft.Azure.Functions.Worker.Extensions.SignalRService | NuGet [1.14.1](https://www.nuget.org/packages/Microsoft.Azure.Functions.Worker.Extensions.SignalRService/1.14.1) | | |
| Microsoft.Azure.Functions.Worker.Extensions.Sql | NuGet [3.1.284](https://www.nuget.org/packages/Microsoft.Azure.Functions.Worker.Extensions.Sql/3.1.284) | | |
| Microsoft.Azure.Functions.Worker.Extensions.Storage | NuGet [6.6.0](https://www.nuget.org/packages/Microsoft.Azure.Functions.Worker.Extensions.Storage/6.6.0) | | |
| Microsoft.Azure.Functions.Worker.Extensions.Storage.Blobs | NuGet [6.6.0](https://www.nuget.org/packages/Microsoft.Azure.Functions.Worker.Extensions.Storage.Blobs/6.6.0) | | |
Expand Down
3 changes: 3 additions & 0 deletions docs/core/compatibility/9.0.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,9 @@ If you're migrating an app to .NET 9, the breaking changes listed here might aff
| Title | Type of change | Introduced version |
|------------------------------------------------------------------------------------------|---------------------|--------------------|
| [DefaultKeyResolution.ShouldGenerateNewKey has altered meaning](aspnet-core/9.0/key-resolution.md) | Behavioral change | Preview 3 |
| [Dev cert export no longer creates folder](aspnet-core/9.0/certificate-export.md) | Behavioral change | RC 1 |
| [HostBuilder enables ValidateOnBuild/ValidateScopes in development environment](aspnet-core/9.0/hostbuilder-validation.md) | Behavioral change | Preview 7 |
| [Middleware types with multiple constructors](aspnet-core/9.0/middleware-constructors.md) | Behavioral change | RC 1 |

## Containers

Expand Down Expand Up @@ -93,6 +95,7 @@ If you're migrating an app to .NET 9, the breaking changes listed here might aff

| Title | Type of change | Introduced version |
|-------------------------------------------------------------------------------|-------------------|--------------------|
| [`dotnet watch` incompatible with Hot Reload for old frameworks](sdk/9.0/dotnet-watch.md) | Behavioral change | RC 1 |
| [`dotnet workload` commands output change](sdk/9.0/dotnet-workload-output.md) | Behavioral change | Preview 1 |
| [`installer` repo version no longer documented](sdk/9.0/productcommits-versions.md) | Behavioral change | Preview 5 |
| [Terminal logger is default](sdk/9.0/terminal-logger.md) | Behavioral change | Preview 1 |
Expand Down
45 changes: 45 additions & 0 deletions docs/core/compatibility/aspnet-core/9.0/certificate-export.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
---
title: "Breaking change: Dev cert export no longer creates folder"
description: Learn about the breaking change in ASP.NET Core 9 where exporting the development certificate no longer creates the target directory if it doesn't exist.
ms.date: 11/6/2024
---

# Dev cert export no longer creates folder

When you export the ASP.NET Core development certificate (which is used to enable HTTPS in local development), it no longer creates the directory into which the certificate is being exported if that directory doesn't exist.

This change first appears in .NET 8.0.10 and .NET 9 RC 1.

## Version introduced

.NET 9 RC 1

## Previous behavior

Previously, if the destination directory didn't exist when the `dotnet dev-certs` command was run, it was created (with permissions inherited from the containing directory). For example, *C:\\NonExistent\\* would have been created given the following command:

```dotnetcli
dotnet dev-certs https -ep C:\NonExistent\cert.pfx
```

## New behavior

Starting in .NET 9, if target directory doesn't exist, the export fails with a message like:

> There was an error exporting the HTTPS developer certificate to a file.

## Type of breaking change

This change is a [behavioral change](../../categories.md#behavioral-change).

## Reason for change

The development certificate is exported with its private key, so unauthorized access can be problematic. It might, nevertheless, be necessary to make it readable to multiple accounts, for example, if the consuming process won't be run as the current user. Rather than attempting to determine (and securely establish) permissions for the target directory, `dotnet dev-certs` requires that it already exist.

## Recommended action

Create the target directory (with appropriate permissions) before invoking `dotnet dev-certs`.

## Affected APIs

N/A
54 changes: 54 additions & 0 deletions docs/core/compatibility/aspnet-core/9.0/middleware-constructors.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
---
title: "Breaking change: Middleware types with multiple constructors"
description: Learn about the breaking change in ASP.NET Core 9 where having multiple constructors in a middleware type can cause an exception at run time.
ms.date: 11/6/2024
---

# Middleware types with multiple constructors

Previously, when a middleware type with multiple satisfiable constructors was instantiated from the dependency injection container, the one with the most parameters was used. Now that only happens if the dependency injection container implements <xref:Microsoft.Extensions.DependencyInjection.IServiceProviderIsService>. If it doesn't, an exception is thrown at run time.

## Version introduced

.NET 9 RC 1

## Previous behavior

Previously, the first of the following two constructors was preferred (when both were satisfied) because it has more parameters.

```csharp
public class CookiePolicyMiddleware
{
public CookiePolicyMiddleware(RequestDelegate next, IOptions<CookiePolicyOptions> options, ILoggerFactory factory)
{
// ...
}

public CookiePolicyMiddleware(RequestDelegate next, IOptions<CookiePolicyOptions> options)
{
// ...
}
}
```

## New behavior

Starting in .NET 9, neither constructor is preferred, and construction fails with an error like:

> System.InvalidOperationException: 'Multiple constructors accepting all given argument types have been found in type 'Microsoft.AspNetCore.CookiePolicy.CookiePolicyMiddleware'. There should only be one applicable constructor.'

## Type of breaking change

This change is a [behavioral change](../../categories.md#behavioral-change).

## Reason for change

The activation mechanism was changed to help support keyed dependency injection.

## Recommended action

If this happens and you can't upgrade to a dependency injection container that implements <xref:Microsoft.Extensions.DependencyInjection.IServiceProviderIsService>, you can add the <xref:Microsoft.Extensions.DependencyInjection.ActivatorUtilitiesConstructorAttribute> to the preferred constructor of the affected middleware type.

## Affected APIs

This change is known to cause errors when instantiating <xref:Microsoft.AspNetCore.CookiePolicy.CookiePolicyMiddleware?displayProperty=fullName> with [Autofac.Extensions.DependencyInjection](https://www.nuget.org/packages/Autofac.Extensions.DependencyInjection) 7.x.
38 changes: 38 additions & 0 deletions docs/core/compatibility/sdk/9.0/dotnet-watch.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
---
title: "Breaking change: 'dotnet watch' incompatible with Hot Reload for old frameworks"
description: Learn about a breaking change in the .NET 9 SDK where 'dotnet watch' requires disabling Hot Reload for projects targeting .NET 5 or earlier.
ms.date: 11/08/2024
---
# 'dotnet watch' incompatible with Hot Reload for old frameworks

.NET 9 introduces a change that requires [`dotnet watch`](../../../tools/dotnet-watch.md) to launched with Hot Reload disabled for projects targeting .NET 5 or earlier versions.

## Previous behavior

Previously, [`dotnet watch`](../../../tools/dotnet-watch.md) automatically disabled Hot Reload when used with projects targeting .NET 5 or earlier.

## New behavior

Starting in .NET 9, an error is reported when [`dotnet watch`](../../../tools/dotnet-watch.md) is launched without `--no-hot-reload` for projects targeting .NET 5 or earlier versions. The error is similar to:

> Hot Reload based watching is only supported in .NET 6.0 or newer apps.

## Version introduced

.NET 9 RC 1

## Type of breaking change

This change is a [behavioral change](../../categories.md#behavioral-change).

## Reason for change

The internal architecture of the `dotnet watch` tool underwent significant improvements. Preserving behavior for out-of-support .NET versions did not warrant increasing the complexity of the new implementation.

## Recommended action

Pass `--no-hot-reload` to `dotnet watch` on the command line, or update your project to target `net6.0` or later (using the `TargetFramework` property).

## Affected APIs

N/A
12 changes: 12 additions & 0 deletions docs/core/compatibility/toc.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,12 @@ items:
items:
- name: DefaultKeyResolution.ShouldGenerateNewKey has altered meaning
href: aspnet-core/9.0/key-resolution.md
- name: Dev cert export no longer creates folder
href: aspnet-core/9.0/certificate-export.md
- name: HostBuilder enables ValidateOnBuild/ValidateScopes in development environment
href: aspnet-core/9.0/hostbuilder-validation.md
- name: Middleware types with multiple constructors
href: aspnet-core/9.0/middleware-constructors.md
- name: Containers
items:
- name: .NET 9 container images no longer install zlib
Expand Down Expand Up @@ -90,6 +94,8 @@ items:
href: networking/9.0/query-redaction-logs.md
- name: SDK and MSBuild
items:
- name: "`dotnet watch` incompatible with Hot Reload for old frameworks"
href: sdk/9.0/dotnet-watch.md
- name: "'dotnet workload' commands output change"
href: sdk/9.0/dotnet-workload-output.md
- name: "'installer' repo version no longer documented"
Expand Down Expand Up @@ -1028,8 +1034,12 @@ items:
items:
- name: DefaultKeyResolution.ShouldGenerateNewKey has altered meaning
href: aspnet-core/9.0/key-resolution.md
- name: Dev cert export no longer creates folder
href: aspnet-core/9.0/certificate-export.md
- name: HostBuilder enables ValidateOnBuild/ValidateScopes in development environment
href: aspnet-core/9.0/hostbuilder-validation.md
- name: Middleware types with multiple constructors
href: aspnet-core/9.0/middleware-constructors.md
- name: .NET 8
items:
- name: ConcurrencyLimiterMiddleware is obsolete
Expand Down Expand Up @@ -1762,6 +1772,8 @@ items:
items:
- name: .NET 9
items:
- name: "`dotnet watch` incompatible with Hot Reload for old frameworks"
href: sdk/9.0/dotnet-watch.md
- name: "'dotnet workload' commands output change"
href: sdk/9.0/dotnet-workload-output.md
- name: "'installer' repo version no longer documented"
Expand Down
2 changes: 0 additions & 2 deletions docs/fsharp/whats-new/fsharp-9.md
Original file line number Diff line number Diff line change
Expand Up @@ -277,8 +277,6 @@ let round1Order = allPlayers |> List.randomShuffle // [ "Charlie"; "Dave"; "Alic

For arrays, there are also `InPlace` variants that shuffle the items in the existing array instead of creating a new one.

```fsharp
#### Choice

The `Choice` functions return a single random element from the given collection. The random choice is weighted evenly on the size of the collection.
Expand Down
Loading