From 98c07dc66ded7431dba1b8b6be8d857f5a8fd5e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rado=C5=A1=20Mili=C4=87ev?= <40705899+rammba@users.noreply.github.com> Date: Wed, 6 Nov 2024 22:36:24 +0100 Subject: [PATCH 1/9] Reference FAQ article instead of GitHub readme --- aspnetcore/signalr/dotnet-client.md | 4 ++-- .../signalr/dotnet-client/sample/SignalRChat/Hubs/ChatHub.cs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/aspnetcore/signalr/dotnet-client.md b/aspnetcore/signalr/dotnet-client.md index 111e0c335909..fec34200767d 100644 --- a/aspnetcore/signalr/dotnet-client.md +++ b/aspnetcore/signalr/dotnet-client.md @@ -139,7 +139,7 @@ connection.Closed += error => In order to configure a custom number of reconnect attempts before disconnecting or change the reconnect timing, `WithAutomaticReconnect` accepts an array of numbers representing the delay in milliseconds to wait before starting each reconnect attempt. ```csharp -HubConnection connection= new HubConnectionBuilder() +HubConnection connection = new HubConnectionBuilder() .WithUrl(new Uri("http://127.0.0.1:5000/chathub")) .WithAutomaticReconnect(new[] { TimeSpan.Zero, TimeSpan.Zero, TimeSpan.FromSeconds(10) }) .Build(); @@ -231,7 +231,7 @@ The `InvokeAsync` method returns a `Task` which completes when the server method The `SendAsync` method returns a `Task` which completes when the message has been sent to the server. No return value is provided since this `Task` doesn't wait until the server method completes. Any exceptions thrown on the client while sending the message produce a faulted `Task`. Use `await` and `try...catch` syntax to handle send errors. > [!NOTE] -> Calling hub methods from a client is only supported when using the Azure SignalR Service in *Default* mode. For more information, see [Frequently Asked Questions (azure-signalr GitHub repository)](https://github.com/Azure/azure-signalr/blob/dev/docs/faq.md#what-is-the-meaning-of-service-mode-defaultserverlessclassic-how-can-i-choose). +> Calling hub methods from a client is only supported when using the Azure SignalR Service in *Default* mode. For more information, see [Frequently Asked Questions](/azure/azure-signalr/signalr-resource-faq). ## Call client methods from hub diff --git a/aspnetcore/signalr/dotnet-client/sample/SignalRChat/Hubs/ChatHub.cs b/aspnetcore/signalr/dotnet-client/sample/SignalRChat/Hubs/ChatHub.cs index 33129ec3944b..e37bba9dfcbf 100644 --- a/aspnetcore/signalr/dotnet-client/sample/SignalRChat/Hubs/ChatHub.cs +++ b/aspnetcore/signalr/dotnet-client/sample/SignalRChat/Hubs/ChatHub.cs @@ -8,7 +8,7 @@ public class ChatHub : Hub #region snippet_SendMessage public async Task SendMessage(string user, string message) { - await Clients.All.SendAsync("ReceiveMessage", user,message); + await Clients.All.SendAsync("ReceiveMessage", user, message); } #endregion } From d47691d8300c33f051a2425ec493ecb0c13ac648 Mon Sep 17 00:00:00 2001 From: Korolev Dmitry Date: Wed, 13 Nov 2024 00:24:43 +0100 Subject: [PATCH 2/9] feat: ASP0028 diagnostic docs (#34084) --- aspnetcore/diagnostics/asp0028.md | 66 +++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 aspnetcore/diagnostics/asp0028.md diff --git a/aspnetcore/diagnostics/asp0028.md b/aspnetcore/diagnostics/asp0028.md new file mode 100644 index 000000000000..99a03bce9e8d --- /dev/null +++ b/aspnetcore/diagnostics/asp0028.md @@ -0,0 +1,66 @@ +--- +title: "ASP0028: ## Analyzer to suggest using IPAddress.IPv6Any instead of IPAddress.Any if applicable" +ms.date: 11/11/2024 +description: "Learn about analysis rule ASP0028: Consider using IPAddress.IPv6Any instead of IPAddress.Any" +author: deaglegross +monikerRange: '>= aspnetcore-10.0' +ms.author: deaglegross +uid: diagnostics/asp0028 +--- +# ASP0028: Consider using `IPAddress.IPv6Any` instead of `IPAddress.Any` + +| | Value | +| - | - | +| **Rule ID** | ASP0028 | +| **Category** | Usage | +| **Fix is breaking or non-breaking** | Non-breaking | + +## Cause + +On the server machine that supports IPv6, listening to `Any`, rather than `IPv6Any` will either not work or be slower than necessary, because of the [underlying System types implementation](https://github.com/dotnet/runtime/issues/82404). + +At the moment of current article publishing, in case of HTTP/1.x or HTTP/2.0 a name like `localhost` will resolve to `[::1]`, which won't be accepted by the server, forcing a retry with `127.0.0.1` (i.e. failed attempt before each connection). + +This usage will be reported with a diagnostic message: +```csharp +.UseKestrel().ConfigureKestrel(options => +{ + options.Listen(IPAddress.Any, ...); +}) +``` + +## Rule description + +The recommended way is to setup Kestrel to listen on `IPv6Any`. + +## How to fix violations + +For the reported code +```csharp +.UseKestrel().ConfigureKestrel(options => +{ + options.Listen(IPAddress.Any, ...); +}) +``` + +One can either explicitly change usage to `IPv6Any`: +```csharp +.UseKestrel().ConfigureKestrel(options => +{ + options.Listen(IPAddress.IPv6Any, ...); +}) +``` + +or use another invocation - `options.ListenAnyIP()` without specifying any argument explicitly: +```csharp +.UseKestrel().ConfigureKestrel(options => +{ + options.ListenAnyIP(...); +}) +``` + +## When to suppress warnings + +The severity level of this diagnostic is Information. You can suppress warnings if your intention is to disable `IPv6` usage completely on the server. + +You can disable IPv6 either system-wide, or for .NET only via the [AppCtx switch or environment variable](https://devblogs.microsoft.com/dotnet/dotnet-6-networking-improvements/#an-option-to-globally-disable-ipv6) From 014806415ed647eb463ca662dd819e0b0d5d4f0f Mon Sep 17 00:00:00 2001 From: James Newton-King Date: Wed, 13 Nov 2024 12:38:18 +0800 Subject: [PATCH 3/9] Add metrics opt-out section to metrics doc (#34057) Co-authored-by: Rick Anderson <3605364+Rick-Anderson@users.noreply.github.com> Co-authored-by: Tom Dykstra --- aspnetcore/log-mon/metrics/metrics.md | 25 ++++++++++++- .../DisableMetrics/DisableMetrics.csproj | 9 +++++ .../metrics/samples/DisableMetrics/Program.cs | 36 +++++++++++++++++++ 3 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 aspnetcore/log-mon/metrics/metrics/samples/DisableMetrics/DisableMetrics.csproj create mode 100644 aspnetcore/log-mon/metrics/metrics/samples/DisableMetrics/Program.cs diff --git a/aspnetcore/log-mon/metrics/metrics.md b/aspnetcore/log-mon/metrics/metrics.md index 2f8cacf28652..f438b55439a1 100644 --- a/aspnetcore/log-mon/metrics/metrics.md +++ b/aspnetcore/log-mon/metrics/metrics.md @@ -90,6 +90,7 @@ For more information, see [dotnet-counters](/dotnet/core/diagnostics/dotnet-coun ## Enrich the ASP.NET Core request metric ASP.NET Core has many built-in metrics. The `http.server.request.duration` metric: + * Records the duration of HTTP requests on the server. * Captures request information in tags, such as the matched route and response status code. @@ -106,7 +107,29 @@ The proceeding example: * The tag allows requests to be categorized by marketing medium type, which could be useful when analyzing web app traffic. > [!NOTE] -> Follow the [multi-dimensional metrics](/dotnet/core/diagnostics/metrics-instrumentation#multi-dimensional-metrics) best practices when enriching with custom tags. Too many tags, or tags with an unbound range cause a large combination of tags. Collection tools have a limit on how many combinations they support for a counter and may start filtering results out to avoid excessive memory usage. +> Follow the [multi-dimensional metrics](/dotnet/core/diagnostics/metrics-instrumentation#multi-dimensional-metrics) best practices when enriching with custom tags. Tags that are too numerous or have an unbound range create many tag combinations, resulting in high dimensions. Collection tools have limits on supported dimensions for a counter and may filter results to prevent excessive memory use. + +:::moniker range=">= aspnetcore-9.0" + +## Opt-out of HTTP metrics on certain endpoints and requests + +Opting out of recording metrics is beneficial for endpoints frequently called by automated systems, such as health checks. Recording metrics for these requests is generally unnecessary. Unwanted telemetry uses resources to collect and store, and can distort results displayed in a telemetry dashboard. + +HTTP requests to an endpoint can be excluded from metrics by adding metadata, with either the [DisableHttpMetrics](xref:Microsoft.AspNetCore.Http.DisableHttpMetricsAttribute) attribute or the [DisableHttpMetrics](xref:Microsoft.AspNetCore.Builder.HttpMetricsEndpointConventionBuilderExtensions.DisableHttpMetrics``1(``0)) method: + +* Add the [DisableHttpMetrics](xref:Microsoft.AspNetCore.Http.DisableHttpMetricsAttribute) attribute to the Web API controller, SignalR hub or gRPC service. +* Call [DisableHttpMetrics](xref:Microsoft.AspNetCore.Builder.HttpMetricsEndpointConventionBuilderExtensions.DisableHttpMetrics``1(``0)) when mapping endpoints in app startup: + +:::code language="csharp" source="~/log-mon/metrics/metrics/samples/DisableMetrics/Program.cs" id="snippet_1" highlight="5"::: + +Alternatively, the property has been added for: + +* Advanced scenarios where a request doesn't map to an endpoint. +* Dynamically disabling metrics collection for specific HTTP requests. + +:::code language="csharp" source="~/log-mon/metrics/metrics/samples/DisableMetrics/Program.cs" id="snippet_2"::: + +:::moniker-end ## Create custom metrics diff --git a/aspnetcore/log-mon/metrics/metrics/samples/DisableMetrics/DisableMetrics.csproj b/aspnetcore/log-mon/metrics/metrics/samples/DisableMetrics/DisableMetrics.csproj new file mode 100644 index 000000000000..6568b3dcfb4b --- /dev/null +++ b/aspnetcore/log-mon/metrics/metrics/samples/DisableMetrics/DisableMetrics.csproj @@ -0,0 +1,9 @@ + + + + net9.0 + enable + enable + + + diff --git a/aspnetcore/log-mon/metrics/metrics/samples/DisableMetrics/Program.cs b/aspnetcore/log-mon/metrics/metrics/samples/DisableMetrics/Program.cs new file mode 100644 index 000000000000..cb94e4c6506f --- /dev/null +++ b/aspnetcore/log-mon/metrics/metrics/samples/DisableMetrics/Program.cs @@ -0,0 +1,36 @@ +#define SECOND // FIRST SECOND +#if NEVER +#elif FIRST +// +var builder = WebApplication.CreateBuilder(args); +builder.Services.AddHealthChecks(); + +var app = builder.Build(); +app.MapHealthChecks("/healthz").DisableHttpMetrics(); +app.Run(); +// +#elif SECOND +using Microsoft.AspNetCore.Http.Features; + +var builder = WebApplication.CreateBuilder(args); +var app = builder.Build(); + +app.MapGet("/", () => "Hello World!"); + +// +// Middleware that conditionally opts-out HTTP requests. +app.Use(async (context, next) => +{ + var metricsFeature = context.Features.Get(); + if (metricsFeature != null && + context.Request.Headers.ContainsKey("x-disable-metrics")) + { + metricsFeature.MetricsDisabled = true; + } + + await next(context); +}); +// + +app.Run(); +#endif From 5f24330ecb8cbdc87c381ad28ad5f9527b70cc9c Mon Sep 17 00:00:00 2001 From: Mike Kistler Date: Wed, 13 Nov 2024 06:37:45 -0800 Subject: [PATCH 4/9] Drop prerelease flags now that .NET 9 has shipped (#34096) --- aspnetcore/fundamentals/openapi/aspnetcore-openapi.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/aspnetcore/fundamentals/openapi/aspnetcore-openapi.md b/aspnetcore/fundamentals/openapi/aspnetcore-openapi.md index d047c39d3d08..a6f8187b716c 100644 --- a/aspnetcore/fundamentals/openapi/aspnetcore-openapi.md +++ b/aspnetcore/fundamentals/openapi/aspnetcore-openapi.md @@ -29,7 +29,7 @@ Install the `Microsoft.AspNetCore.OpenApi` package: Run the following command from the **Package Manager Console**: ```powershell - Install-Package Microsoft.AspNetCore.OpenApi -IncludePrerelease + Install-Package Microsoft.AspNetCore.OpenApi ``` ### [.NET CLI](#tab/net-cli) @@ -37,7 +37,7 @@ Run the following command from the **Package Manager Console**: Run the following command: ```dotnetcli -dotnet add package Microsoft.AspNetCore.OpenApi --prerelease +dotnet add package Microsoft.AspNetCore.OpenApi ``` --- @@ -133,7 +133,7 @@ To add support for generating OpenAPI documents at build time, install the `Micr Run the following command from the **Package Manager Console**: ```powershell - Install-Package Microsoft.Extensions.ApiDescription.Server -IncludePrerelease + Install-Package Microsoft.Extensions.ApiDescription.Server ``` ### [.NET CLI](#tab/net-cli) @@ -141,7 +141,7 @@ Run the following command from the **Package Manager Console**: Run the following command in the directory that contains the project file: ```dotnetcli -dotnet add package Microsoft.Extensions.ApiDescription.Server --prerelease +dotnet add package Microsoft.Extensions.ApiDescription.Server ``` --- From f5e471f63b058573057f13818c65129fb290a13f Mon Sep 17 00:00:00 2001 From: Luke Latham <1622880+guardrex@users.noreply.github.com> Date: Wed, 13 Nov 2024 10:31:13 -0500 Subject: [PATCH 5/9] Reconnection UI guidance updates (#34104) --- aspnetcore/blazor/fundamentals/signalr.md | 57 ++++++++++++++---- .../_static/reconnection-ui-80-or-earlier.png | Bin 0 -> 14018 bytes .../_static/reconnection-ui-90-or-later.png | Bin 0 -> 12069 bytes .../_static/retry-ui-80-or-earlier.png | Bin 0 -> 19420 bytes .../signalr/_static/retry-ui-90-or-later.png | Bin 0 -> 15554 bytes 5 files changed, 46 insertions(+), 11 deletions(-) create mode 100644 aspnetcore/blazor/fundamentals/signalr/_static/reconnection-ui-80-or-earlier.png create mode 100644 aspnetcore/blazor/fundamentals/signalr/_static/reconnection-ui-90-or-later.png create mode 100644 aspnetcore/blazor/fundamentals/signalr/_static/retry-ui-80-or-earlier.png create mode 100644 aspnetcore/blazor/fundamentals/signalr/_static/retry-ui-90-or-later.png diff --git a/aspnetcore/blazor/fundamentals/signalr.md b/aspnetcore/blazor/fundamentals/signalr.md index 5ed800690d18..151e764a0a87 100644 --- a/aspnetcore/blazor/fundamentals/signalr.md +++ b/aspnetcore/blazor/fundamentals/signalr.md @@ -491,11 +491,39 @@ In the `Program` file, call . :::moniker range=">= aspnetcore-8.0" -To customize the UI, define a single element with an `id` of `components-reconnect-modal`. The following example places the element in the `App` component. +To customize the UI, define a single element with an `id` of `components-reconnect-modal` in the `` element content. The following example places the element in the `App` component. `App.razor`: @@ -503,7 +531,7 @@ To customize the UI, define a single element with an `id` of `components-reconne :::moniker range=">= aspnetcore-7.0 < aspnetcore-8.0" -To customize the UI, define a single element with an `id` of `components-reconnect-modal`. The following example places the element in the host page. +To customize the UI, define a single element with an `id` of `components-reconnect-modal` in the `` element content. The following example places the element in the host page. `Pages/_Host.cshtml`: @@ -511,7 +539,7 @@ To customize the UI, define a single element with an `id` of `components-reconne :::moniker range=">= aspnetcore-6.0 < aspnetcore-7.0" -To customize the UI, define a single element with an `id` of `components-reconnect-modal`. The following example places the element in the layout page. +To customize the UI, define a single element with an `id` of `components-reconnect-modal` in the `` element content. The following example places the element in the layout page. `Pages/_Layout.cshtml`: @@ -519,7 +547,7 @@ To customize the UI, define a single element with an `id` of `components-reconne :::moniker range="< aspnetcore-6.0" -To customize the UI, define a single element with an `id` of `components-reconnect-modal`. The following example places the element in the host page. +To customize the UI, define a single element with an `id` of `components-reconnect-modal` in the `` element content. The following example places the element in the host page. `Pages/_Host.cshtml`: @@ -527,7 +555,7 @@ To customize the UI, define a single element with an `id` of `components-reconne ```cshtml
- There was a problem with the connection! + Connection lost.
Attempting to reconnect...
``` @@ -557,6 +585,15 @@ Add the following CSS styles to the site's stylesheet. #components-reconnect-modal.components-reconnect-failed, #components-reconnect-modal.components-reconnect-rejected { display: block; + background-color: white; + padding: 2rem; + border-radius: 0.5rem; + text-align: center; + box-shadow: 0 3px 6px 2px rgba(0, 0, 0, 0.3); + margin: 50px 50px; + position: fixed; + top: 0; + z-index: 10001; } ``` @@ -581,7 +618,7 @@ Customize the delay before the reconnection UI appears by setting the `transitio :::moniker-end -:::moniker range="< aspnetcore-8.0" +:::moniker range=">= aspnetcore-5.0 < aspnetcore-8.0" `wwwroot/css/site.css`: @@ -606,11 +643,9 @@ To display the current reconnect attempt, define an element with an `id` of `com ``` -When the custom reconnect modal appears, it renders content similar to the following based on the preceding code: +When the custom reconnect modal appears, it renders the following content with a reconnection attempt counter: -```html -There was a problem with the connection! (Current reconnect attempt: 3 / 8) -``` +> :::no-loc text="There was a problem with the connection! (Current reconnect attempt: 1 / 8)"::: :::moniker-end diff --git a/aspnetcore/blazor/fundamentals/signalr/_static/reconnection-ui-80-or-earlier.png b/aspnetcore/blazor/fundamentals/signalr/_static/reconnection-ui-80-or-earlier.png new file mode 100644 index 0000000000000000000000000000000000000000..ff7e64fc6144919587a8da34d9ce03721728fc7a GIT binary patch literal 14018 zcmbVzbyOTr(CtQW_u%fDV8IFQ?i$?P9TJ=X!QF$qySoS1UED3W!<*#yo%6mw-+7#~ zv%9l1J>6Z^)wk{~!W87hk>K&*K_C#4q=bkP2=w*>_#6fM7C5d3dxZjTaP|_KP9P9A z<=@vENhOLuAP~H~g|M)Kg1Mcuos+qpJ&B~SFp0gRovDSj2?*rAoS|%{qI`hOcMG`^ zk`DEcm$p;Ff+bNBitxvbp`s&&LzN08%~`@y>_!t6eUCqs9r`XR%KrzJA_HPL{36UY zX>Qc_ywLEG#|^JMtNFIu-SLQy|1Xxg)Y+4r!LC7o0p-_s>8~?yJUCuF| zrD6RsL4ux9LIof}u{Zu1$yCaq?DwFrqeg~XAO%LyS8BiA8IXU*U5eKmkaj#N)|>1Y z5DA7!s0hfM2UIqx7A^|XU;$y8O80Sr78yY-lIo@spsGet*90m;4G0zy#G)7)L<@TF z1^PNfPVNp0OaWnvU8wV((^sJG(E&4+Qp4L!!6h1?4a?{Nqpr?GL^C0YLyyT}@YWzz zkg3Nb1@}_`8_N3S7zmUdg9VKC^4Wa?xng31BdP&epYgC0`jyPkaO-7fveaG>1ln-+ zoqAzluEq1`f%dm~$)!AfZ?1=s?Q$DoT7x2356V7RR=>3WJ2#>^Kbx19cDA<{rTT=l z4Mx;`Ud(#*yVRep?|pfnZm-unHYox==>~|uzgzDayOPN#n2d!BG+f<{7Jq6)czq(A zA?uSgY}TN|+)_k$h!RQtarr5qEKDetwx4qP)p&D_;qe{+8at@UlK+iY3}cb5(YqUI zYE%v9uFYEz=%UrGdzJ?Foxl0_jY+rHGl6IEY)X*7sbs7J2&5-M!K5-$D=-KP0*Pb? z&{ciGzv}+L&;?D<4Yk^h@br}

7PugtT8glt`k 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 literal 0 HcmV?d00001 diff --git a/aspnetcore/blazor/fundamentals/signalr/_static/reconnection-ui-90-or-later.png b/aspnetcore/blazor/fundamentals/signalr/_static/reconnection-ui-90-or-later.png new file mode 100644 index 0000000000000000000000000000000000000000..a08404aa2fdc2853d8111a259005472864b64006 GIT binary patch literal 12069 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

F|6HNh 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 literal 0 HcmV?d00001 From 6e6fe9d5ae01022c4e39e82f60e9cfb390055150 Mon Sep 17 00:00:00 2001 From: Luke Latham <1622880+guardrex@users.noreply.github.com> Date: Wed, 13 Nov 2024 13:14:07 -0500 Subject: [PATCH 6/9] Add a not-latest-version INCLUDE (#34108) --- ...t-version-without-not-supported-content.md | 29 +++++++++++++++++++ aspnetcore/includes/not-latest-version.md | 17 +++++++++-- 2 files changed, 43 insertions(+), 3 deletions(-) create mode 100644 aspnetcore/includes/not-latest-version-without-not-supported-content.md diff --git a/aspnetcore/includes/not-latest-version-without-not-supported-content.md b/aspnetcore/includes/not-latest-version-without-not-supported-content.md new file mode 100644 index 000000000000..a7f3e4d4a3a7 --- /dev/null +++ b/aspnetcore/includes/not-latest-version-without-not-supported-content.md @@ -0,0 +1,29 @@ +:::moniker range="< aspnetcore-9.0" +> [!NOTE] +> This isn't the latest version of this article. For the current release, see the [.NET 9 version of this article](?view=aspnetcore-9.0&preserve-view=true). +:::moniker-end + +:::moniker range="> aspnetcore-9.0" +> [!IMPORTANT] +> This information relates to a pre-release product that may be substantially modified before it's commercially released. Microsoft makes no warranties, express or implied, with respect to the information provided here. +> +> For the current release, see the [.NET 9 version of this article](?view=aspnetcore-9.0&preserve-view=true). +:::moniker-end + + diff --git a/aspnetcore/includes/not-latest-version.md b/aspnetcore/includes/not-latest-version.md index ca1f12faf3e4..1eccb5a2b614 100644 --- a/aspnetcore/includes/not-latest-version.md +++ b/aspnetcore/includes/not-latest-version.md @@ -15,9 +15,20 @@ :::moniker-end From eea43c2b989357b94f6162c38b40e8651b145d28 Mon Sep 17 00:00:00 2001 From: Luke Latham <1622880+guardrex@users.noreply.github.com> Date: Wed, 13 Nov 2024 13:22:49 -0500 Subject: [PATCH 7/9] Activate preview notices (#34099) --- .../class-libraries-and-static-server-side-rendering.md | 6 +----- aspnetcore/blazor/components/integration.md | 6 +----- aspnetcore/blazor/components/prerender.md | 6 +----- aspnetcore/blazor/components/quickgrid.md | 6 +----- .../components/render-components-outside-of-aspnetcore.md | 6 +----- aspnetcore/blazor/components/render-modes.md | 6 +----- aspnetcore/blazor/components/sections.md | 6 +----- aspnetcore/blazor/hybrid/troubleshoot.md | 6 +----- aspnetcore/blazor/hybrid/tutorials/maui-blazor-web-app.md | 2 ++ .../javascript-interoperability/static-server-rendering.md | 6 +----- aspnetcore/blazor/security/blazor-web-app-with-oidc.md | 6 +----- .../server/account-confirmation-and-password-recovery.md | 2 ++ .../security/server/qrcodes-for-authenticator-apps.md | 2 ++ .../blazor/security/server/static-server-side-rendering.md | 6 +----- .../webassembly/microsoft-entra-id-groups-and-roles.md | 6 +----- .../blazor/security/webassembly/standalone-with-identity.md | 6 +----- aspnetcore/blazor/tutorials/movie-database-app/index.md | 6 +----- aspnetcore/blazor/tutorials/movie-database-app/part-1.md | 6 +----- aspnetcore/blazor/tutorials/movie-database-app/part-2.md | 6 +----- aspnetcore/blazor/tutorials/movie-database-app/part-3.md | 6 +----- aspnetcore/blazor/tutorials/movie-database-app/part-4.md | 6 +----- aspnetcore/blazor/tutorials/movie-database-app/part-5.md | 6 +----- aspnetcore/blazor/tutorials/movie-database-app/part-6.md | 6 +----- aspnetcore/blazor/tutorials/movie-database-app/part-7.md | 6 +----- aspnetcore/blazor/tutorials/movie-database-app/part-8.md | 6 +----- 25 files changed, 28 insertions(+), 110 deletions(-) diff --git a/aspnetcore/blazor/components/class-libraries-and-static-server-side-rendering.md b/aspnetcore/blazor/components/class-libraries-and-static-server-side-rendering.md index d963215e51f6..32673c24c7c0 100644 --- a/aspnetcore/blazor/components/class-libraries-and-static-server-side-rendering.md +++ b/aspnetcore/blazor/components/class-libraries-and-static-server-side-rendering.md @@ -10,11 +10,7 @@ uid: blazor/components/class-libraries-with-static-ssr --- # ASP.NET Core Razor class libraries (RCLs) with static server-side rendering (static SSR) - +[!INCLUDE[](~/includes/not-latest-version-without-not-supported-content.md)] This article provides guidance for component library authors considering support for static server-side rendering (static SSR). diff --git a/aspnetcore/blazor/components/integration.md b/aspnetcore/blazor/components/integration.md index 3f26a167faab..be74fa2b5a29 100644 --- a/aspnetcore/blazor/components/integration.md +++ b/aspnetcore/blazor/components/integration.md @@ -10,11 +10,7 @@ uid: blazor/components/integration --- # Integrate ASP.NET Core Razor components into ASP.NET Core apps - +[!INCLUDE[](~/includes/not-latest-version-without-not-supported-content.md)] This article explains Razor component integration scenarios for ASP.NET Core apps. diff --git a/aspnetcore/blazor/components/prerender.md b/aspnetcore/blazor/components/prerender.md index 0fd1a17e7d5c..bb154215020c 100644 --- a/aspnetcore/blazor/components/prerender.md +++ b/aspnetcore/blazor/components/prerender.md @@ -10,11 +10,7 @@ uid: blazor/components/prerender --- # Prerender ASP.NET Core Razor components - +[!INCLUDE[](~/includes/not-latest-version-without-not-supported-content.md)] +[!INCLUDE[](~/includes/not-latest-version-without-not-supported-content.md)] The [`QuickGrid`](xref:Microsoft.AspNetCore.Components.QuickGrid) component is a Razor component for quickly and efficiently displaying data in tabular form. `QuickGrid` provides a simple and convenient data grid component for common grid rendering scenarios and serves as a reference architecture and performance baseline for building data grid components. `QuickGrid` is highly optimized and uses advanced techniques to achieve optimal rendering performance. diff --git a/aspnetcore/blazor/components/render-components-outside-of-aspnetcore.md b/aspnetcore/blazor/components/render-components-outside-of-aspnetcore.md index 5c64ced5955d..b1217fb8a8d3 100644 --- a/aspnetcore/blazor/components/render-components-outside-of-aspnetcore.md +++ b/aspnetcore/blazor/components/render-components-outside-of-aspnetcore.md @@ -10,11 +10,7 @@ uid: blazor/components/render-outside-of-aspnetcore --- # Render Razor components outside of ASP.NET Core - +[!INCLUDE[](~/includes/not-latest-version-without-not-supported-content.md)] Razor components can be rendered outside of the context of an HTTP request. You can render Razor components as HTML directly to a string or stream independently of the ASP.NET Core hosting environment. This is convenient for scenarios where you want to generate HTML fragments, such as for generating email content, generating static site content, or for building a content templating engine. diff --git a/aspnetcore/blazor/components/render-modes.md b/aspnetcore/blazor/components/render-modes.md index 61e3a8afd2c1..77bdf0e6a17b 100644 --- a/aspnetcore/blazor/components/render-modes.md +++ b/aspnetcore/blazor/components/render-modes.md @@ -10,11 +10,7 @@ uid: blazor/components/render-modes --- # ASP.NET Core Blazor render modes - +[!INCLUDE[](~/includes/not-latest-version-without-not-supported-content.md)] This article explains control of Razor component rendering in Blazor Web Apps, either at compile time or runtime. diff --git a/aspnetcore/blazor/components/sections.md b/aspnetcore/blazor/components/sections.md index 51ce9416b44a..5206fbd93666 100644 --- a/aspnetcore/blazor/components/sections.md +++ b/aspnetcore/blazor/components/sections.md @@ -10,11 +10,7 @@ uid: blazor/components/sections --- # ASP.NET Core Blazor sections - +[!INCLUDE[](~/includes/not-latest-version-without-not-supported-content.md)] This article explains how to control the content in a Razor component from a child Razor component. diff --git a/aspnetcore/blazor/hybrid/troubleshoot.md b/aspnetcore/blazor/hybrid/troubleshoot.md index 0bbcd11e1b1c..85de7a18f5c0 100644 --- a/aspnetcore/blazor/hybrid/troubleshoot.md +++ b/aspnetcore/blazor/hybrid/troubleshoot.md @@ -10,11 +10,7 @@ uid: blazor/hybrid/troubleshoot --- # Troubleshoot ASP.NET Core Blazor Hybrid - +[!INCLUDE[](~/includes/not-latest-version-without-not-supported-content.md)] has built-in logging that can help you diagnose problems in your Blazor Hybrid app. diff --git a/aspnetcore/blazor/hybrid/tutorials/maui-blazor-web-app.md b/aspnetcore/blazor/hybrid/tutorials/maui-blazor-web-app.md index 24079ade0b7d..d27cbd51beba 100644 --- a/aspnetcore/blazor/hybrid/tutorials/maui-blazor-web-app.md +++ b/aspnetcore/blazor/hybrid/tutorials/maui-blazor-web-app.md @@ -10,6 +10,8 @@ uid: blazor/hybrid/tutorials/maui-blazor-web-app --- # Build a .NET MAUI Blazor Hybrid app with a Blazor Web App +[!INCLUDE[](~/includes/not-latest-version-without-not-supported-content.md)] + This article shows you how to build a .NET MAUI Blazor Hybrid app with a Blazor Web App that uses a shared user interface via a Razor class library (RCL). ## Prerequisites and preliminary steps diff --git a/aspnetcore/blazor/javascript-interoperability/static-server-rendering.md b/aspnetcore/blazor/javascript-interoperability/static-server-rendering.md index 62f9baf36a23..9213318c4a28 100644 --- a/aspnetcore/blazor/javascript-interoperability/static-server-rendering.md +++ b/aspnetcore/blazor/javascript-interoperability/static-server-rendering.md @@ -10,11 +10,7 @@ uid: blazor/js-interop/ssr --- # ASP.NET Core Blazor JavaScript with static server-side rendering (static SSR) - +[!INCLUDE[](~/includes/not-latest-version-without-not-supported-content.md)] This article explains how to load JavaScript (JS) in a Blazor Web App with static server-side rendering (static SSR) and [enhanced navigation](xref:blazor/fundamentals/routing#enhanced-navigation-and-form-handling). diff --git a/aspnetcore/blazor/security/blazor-web-app-with-oidc.md b/aspnetcore/blazor/security/blazor-web-app-with-oidc.md index d8a483d84e53..9234319c0240 100644 --- a/aspnetcore/blazor/security/blazor-web-app-with-oidc.md +++ b/aspnetcore/blazor/security/blazor-web-app-with-oidc.md @@ -11,11 +11,7 @@ zone_pivot_groups: blazor-web-app-oidc-specification --- # Secure an ASP.NET Core Blazor Web App with OpenID Connect (OIDC) - +[!INCLUDE[](~/includes/not-latest-version-without-not-supported-content.md)] This article describes how to secure a Blazor Web App with [OpenID Connect (OIDC)](https://openid.net/developers/how-connect-works/) using a sample app in the [`dotnet/blazor-samples` GitHub repository (.NET 8 or later)](https://github.com/dotnet/blazor-samples) ([how to download](xref:blazor/fundamentals/index#sample-apps)). diff --git a/aspnetcore/blazor/security/server/account-confirmation-and-password-recovery.md b/aspnetcore/blazor/security/server/account-confirmation-and-password-recovery.md index 568b3d64e619..00b5301384d7 100644 --- a/aspnetcore/blazor/security/server/account-confirmation-and-password-recovery.md +++ b/aspnetcore/blazor/security/server/account-confirmation-and-password-recovery.md @@ -9,6 +9,8 @@ uid: blazor/security/server/account-confirmation-and-password-recovery --- # Account confirmation and password recovery in ASP.NET Core Blazor +[!INCLUDE[](~/includes/not-latest-version-without-not-supported-content.md)] + This article explains how to configure an ASP.NET Core Blazor Web App with email confirmation and password recovery. ## Namespace diff --git a/aspnetcore/blazor/security/server/qrcodes-for-authenticator-apps.md b/aspnetcore/blazor/security/server/qrcodes-for-authenticator-apps.md index 8e63126a14c5..33b495535c71 100644 --- a/aspnetcore/blazor/security/server/qrcodes-for-authenticator-apps.md +++ b/aspnetcore/blazor/security/server/qrcodes-for-authenticator-apps.md @@ -9,6 +9,8 @@ uid: blazor/security/server/qrcodes-for-authenticator-apps --- # Enable QR code generation for TOTP authenticator apps in an ASP.NET Core Blazor Web App +[!INCLUDE[](~/includes/not-latest-version-without-not-supported-content.md)] + This article explains how to configure an ASP.NET Core Blazor Web App with QR code generation for TOTP authenticator apps. For an introduction to two-factor authentication (2FA) with authenticator apps using a Time-based One-time Password Algorithm (TOTP), see . diff --git a/aspnetcore/blazor/security/server/static-server-side-rendering.md b/aspnetcore/blazor/security/server/static-server-side-rendering.md index aae18ca506f6..5425a21a4841 100644 --- a/aspnetcore/blazor/security/server/static-server-side-rendering.md +++ b/aspnetcore/blazor/security/server/static-server-side-rendering.md @@ -10,11 +10,7 @@ uid: blazor/security/server/static-server-side-rendering --- # Threat mitigation guidance for ASP.NET Core Blazor static server-side rendering - +[!INCLUDE[](~/includes/not-latest-version-without-not-supported-content.md)] This article explains the security considerations that developers should take into account when developing Blazor Web Apps with static server-side rendering. diff --git a/aspnetcore/blazor/security/webassembly/microsoft-entra-id-groups-and-roles.md b/aspnetcore/blazor/security/webassembly/microsoft-entra-id-groups-and-roles.md index 42140e821e42..5c2edd4c9b01 100644 --- a/aspnetcore/blazor/security/webassembly/microsoft-entra-id-groups-and-roles.md +++ b/aspnetcore/blazor/security/webassembly/microsoft-entra-id-groups-and-roles.md @@ -10,11 +10,7 @@ uid: blazor/security/webassembly/meid-groups-roles --- # Microsoft Entra (ME-ID) groups, Administrator Roles, and App Roles - +[!INCLUDE[](~/includes/not-latest-version-without-not-supported-content.md)] This article explains how to configure Blazor WebAssembly to use Microsoft Entra ID (ME-ID) groups and roles. diff --git a/aspnetcore/blazor/security/webassembly/standalone-with-identity.md b/aspnetcore/blazor/security/webassembly/standalone-with-identity.md index 27a24a5c3134..039ddd0989cf 100644 --- a/aspnetcore/blazor/security/webassembly/standalone-with-identity.md +++ b/aspnetcore/blazor/security/webassembly/standalone-with-identity.md @@ -10,11 +10,7 @@ uid: blazor/security/webassembly/standalone-with-identity --- # Secure ASP.NET Core Blazor WebAssembly with ASP.NET Core Identity - +[!INCLUDE[](~/includes/not-latest-version-without-not-supported-content.md)] Standalone Blazor WebAssembly apps can be secured with ASP.NET Core Identity by following the guidance in this article. diff --git a/aspnetcore/blazor/tutorials/movie-database-app/index.md b/aspnetcore/blazor/tutorials/movie-database-app/index.md index ce8f277a6271..7e442bd521b8 100644 --- a/aspnetcore/blazor/tutorials/movie-database-app/index.md +++ b/aspnetcore/blazor/tutorials/movie-database-app/index.md @@ -10,11 +10,7 @@ uid: blazor/tutorials/movie-database-app/index --- # Build a Blazor movie database app (Overview) - +[!INCLUDE[](~/includes/not-latest-version-without-not-supported-content.md)] This tutorial explains the basics of building a Blazor Web App with a database, Entity Framework (EF) Core, and user interactivity. diff --git a/aspnetcore/blazor/tutorials/movie-database-app/part-1.md b/aspnetcore/blazor/tutorials/movie-database-app/part-1.md index 591dedf6ac40..785cc3611872 100644 --- a/aspnetcore/blazor/tutorials/movie-database-app/part-1.md +++ b/aspnetcore/blazor/tutorials/movie-database-app/part-1.md @@ -11,11 +11,7 @@ zone_pivot_groups: tooling --- # Build a Blazor movie database app (Part 1 - Create a Blazor Web App) - +[!INCLUDE[](~/includes/not-latest-version-without-not-supported-content.md)] This article is the first part of the Blazor movie database app tutorial that teaches you the basics of building an ASP.NET Core Blazor Web App with features to manage a movie database. diff --git a/aspnetcore/blazor/tutorials/movie-database-app/part-2.md b/aspnetcore/blazor/tutorials/movie-database-app/part-2.md index bf928dd347db..28c463234a08 100644 --- a/aspnetcore/blazor/tutorials/movie-database-app/part-2.md +++ b/aspnetcore/blazor/tutorials/movie-database-app/part-2.md @@ -11,11 +11,7 @@ zone_pivot_groups: tooling --- # Build a Blazor movie database app (Part 2 - Add and scaffold a model) - +[!INCLUDE[](~/includes/not-latest-version-without-not-supported-content.md)] This article is the second part of the Blazor movie database app tutorial that teaches you the basics of building an ASP.NET Core Blazor Web App with features to manage a movie database. diff --git a/aspnetcore/blazor/tutorials/movie-database-app/part-3.md b/aspnetcore/blazor/tutorials/movie-database-app/part-3.md index 3c2a2128448e..d3caa7123df3 100644 --- a/aspnetcore/blazor/tutorials/movie-database-app/part-3.md +++ b/aspnetcore/blazor/tutorials/movie-database-app/part-3.md @@ -11,11 +11,7 @@ zone_pivot_groups: tooling --- # Build a Blazor movie database app (Part 3 - Learn about Razor components) - +[!INCLUDE[](~/includes/not-latest-version-without-not-supported-content.md)] This article is the third part of the Blazor movie database app tutorial that teaches you the basics of building an ASP.NET Core Blazor Web App with features to manage a movie database. diff --git a/aspnetcore/blazor/tutorials/movie-database-app/part-4.md b/aspnetcore/blazor/tutorials/movie-database-app/part-4.md index 786d8137a4cc..1624688f2abc 100644 --- a/aspnetcore/blazor/tutorials/movie-database-app/part-4.md +++ b/aspnetcore/blazor/tutorials/movie-database-app/part-4.md @@ -11,11 +11,7 @@ zone_pivot_groups: tooling --- # Build a Blazor movie database app (Part 4 - Work with a database) - +[!INCLUDE[](~/includes/not-latest-version-without-not-supported-content.md)] This article is the fourth part of the Blazor movie database app tutorial that teaches you the basics of building an ASP.NET Core Blazor Web App with features to manage a movie database. diff --git a/aspnetcore/blazor/tutorials/movie-database-app/part-5.md b/aspnetcore/blazor/tutorials/movie-database-app/part-5.md index 4adfca722b0e..1f4e6ad6565e 100644 --- a/aspnetcore/blazor/tutorials/movie-database-app/part-5.md +++ b/aspnetcore/blazor/tutorials/movie-database-app/part-5.md @@ -11,11 +11,7 @@ zone_pivot_groups: tooling --- # Build a Blazor movie database app (Part 5 - Add validation) - +[!INCLUDE[](~/includes/not-latest-version-without-not-supported-content.md)] This article is the fifth part of the Blazor movie database app tutorial that teaches you the basics of building an ASP.NET Core Blazor Web App with features to manage a movie database. diff --git a/aspnetcore/blazor/tutorials/movie-database-app/part-6.md b/aspnetcore/blazor/tutorials/movie-database-app/part-6.md index bdb4ada8949a..1b9bb7cc88e9 100644 --- a/aspnetcore/blazor/tutorials/movie-database-app/part-6.md +++ b/aspnetcore/blazor/tutorials/movie-database-app/part-6.md @@ -11,11 +11,7 @@ zone_pivot_groups: tooling --- # Build a Blazor movie database app (Part 6 - Add search) - +[!INCLUDE[](~/includes/not-latest-version-without-not-supported-content.md)] This article is the sixth part of the Blazor movie database app tutorial that teaches you the basics of building an ASP.NET Core Blazor Web App with features to manage a movie database. diff --git a/aspnetcore/blazor/tutorials/movie-database-app/part-7.md b/aspnetcore/blazor/tutorials/movie-database-app/part-7.md index 02d313dd032a..4beff2eaab38 100644 --- a/aspnetcore/blazor/tutorials/movie-database-app/part-7.md +++ b/aspnetcore/blazor/tutorials/movie-database-app/part-7.md @@ -11,11 +11,7 @@ zone_pivot_groups: tooling --- # Build a Blazor movie database app (Part 7 - Add a new field) - +[!INCLUDE[](~/includes/not-latest-version-without-not-supported-content.md)] This article is the seventh part of the Blazor movie database app tutorial that teaches you the basics of building an ASP.NET Core Blazor Web App with features to manage a movie database. diff --git a/aspnetcore/blazor/tutorials/movie-database-app/part-8.md b/aspnetcore/blazor/tutorials/movie-database-app/part-8.md index fe73f9c6899c..9c1968bc0c2d 100644 --- a/aspnetcore/blazor/tutorials/movie-database-app/part-8.md +++ b/aspnetcore/blazor/tutorials/movie-database-app/part-8.md @@ -11,11 +11,7 @@ zone_pivot_groups: tooling --- # Build a Blazor movie database app (Part 8 - Add interactivity) - +[!INCLUDE[](~/includes/not-latest-version-without-not-supported-content.md)] This article is the eighth part of the Blazor movie database app tutorial that teaches you the basics of building an ASP.NET Core Blazor Web App with features to manage a movie database. From 38acaae8cc74fca8174db9a5267a899fac5f5c01 Mon Sep 17 00:00:00 2001 From: Tom Dykstra Date: Wed, 13 Nov 2024 12:22:48 -0800 Subject: [PATCH 8/9] WIP: Moniker prep Fundamentals overview (#34111) --- aspnetcore/fundamentals/index.md | 3 +- .../fundamentals/index/includes/index8.md | 218 ++++++++++++++++++ 2 files changed, 220 insertions(+), 1 deletion(-) create mode 100644 aspnetcore/fundamentals/index/includes/index8.md diff --git a/aspnetcore/fundamentals/index.md b/aspnetcore/fundamentals/index.md index 515d419359f5..164a5df16670 100644 --- a/aspnetcore/fundamentals/index.md +++ b/aspnetcore/fundamentals/index.md @@ -12,7 +12,7 @@ uid: fundamentals/index [!INCLUDE[](~/includes/not-latest-version.md)] -:::moniker range=">= aspnetcore-8.0" +:::moniker range=">= aspnetcore-9.0" This article provides an overview of the fundamentals for building ASP.NET Core apps, including dependency injection (DI), configuration, middleware, and more. @@ -232,3 +232,4 @@ For more information, see . :::moniker-end [!INCLUDE[](~/fundamentals/index/includes/index3-7.md)] +[!INCLUDE[](~/fundamentals/index/includes/index8.md)] diff --git a/aspnetcore/fundamentals/index/includes/index8.md b/aspnetcore/fundamentals/index/includes/index8.md new file mode 100644 index 000000000000..30a71cf07228 --- /dev/null +++ b/aspnetcore/fundamentals/index/includes/index8.md @@ -0,0 +1,218 @@ +:::moniker range="= aspnetcore-8.0" + +This article provides an overview of the fundamentals for building ASP.NET Core apps, including dependency injection (DI), configuration, middleware, and more. + +For Blazor fundamentals guidance, which adds to or supersedes the guidance in this node, see . + +## Program.cs + +ASP.NET Core apps created with the web templates contain the application startup code in the `Program.cs` file. The `Program.cs` file is where: + +* Services required by the app are configured. +* The app's request handling pipeline is defined as a series of [middleware components](xref:fundamentals/middleware/index). + +The following app startup code supports: + +* [Razor Pages](xref:tutorials/razor-pages/razor-pages-start) +* [MVC controllers with views](xref:tutorials/first-mvc-app/start-mvc) +* [Web API with controllers](xref:tutorials/first-web-api) +* [Minimal web APIs](xref:tutorials/min-web-api) + +[!code-csharp[](~/fundamentals/startup/6.0_samples/WebAll/Program.cs?name=snippet)] + +## Dependency injection (services) + +ASP.NET Core includes [dependency injection (DI)](xref:fundamentals/dependency-injection) that makes configured services available throughout an app. Services are added to the DI container with [WebApplicationBuilder.Services](xref:Microsoft.AspNetCore.Builder.WebApplicationBuilder.Services), `builder.Services` in the preceding code. When the is instantiated, many [framework-provided services](xref:fundamentals/dependency-injection#framework-provided-services) are added. `builder` is a `WebApplicationBuilder` in the following code: + +[!code-csharp[](~/fundamentals/startup/6.0_samples/WebAll/Program.cs?name=snippet2&highlight=1)] + +In the preceding highlighted code, `builder` has configuration, logging, and [many other services](xref:fundamentals/dependency-injection#framework-provided-services) added to the DI container. + +The following code adds Razor Pages, MVC controllers with views, and a custom to the DI container: + +[!code-csharp[](~/fundamentals/index/samples/6.0/RazorPagesMovie/Program.cs?name=snippet2&highlight=6-10)] + +Services are typically resolved from DI using constructor injection. The DI framework provides an instance of this service at runtime. + +The following code uses constructor injection to resolve the database context and logger from DI: + +[!code-csharp[](~/fundamentals/index/samples/6.0/RazorPagesMovie/Pages/Movies/Index.cshtml.cs?name=snippet&highlight=3-10, 16-17)] + +## Middleware + +The request handling pipeline is composed as a series of middleware components. Each component performs operations on an [`HttpContext`](xref:fundamentals/httpcontext) and either invokes the next middleware in the pipeline or terminates the request. + +By convention, a middleware component is added to the pipeline by invoking a `Use{Feature}` extension method. Middleware added to the app is highlighted in the following code: + +[!code-csharp[](~/fundamentals/startup/6.0_samples/WebAll/Program.cs?name=snippet&highlight=12-19)] + +For more information, see . + +## Host + +On startup, an ASP.NET Core app builds a *host*. The host encapsulates all of the app's resources, such as: + +* An HTTP server implementation +* Middleware components +* Logging +* Dependency injection (DI) services +* Configuration + +There are three different hosts capable of running an ASP.NET Core app: + +* [ASP.NET Core WebApplication](xref:fundamentals/minimal-apis/webapplication), also known as the [Minimal Host](xref:migration/50-to-60#new-hosting-model) +* [.NET Generic Host](xref:fundamentals/host/generic-host) combined with ASP.NET Core's +* [ASP.NET Core WebHost](xref:fundamentals/host/web-host) + +The ASP.NET Core and types are recommended and used in all the ASP.NET Core templates. `WebApplication` behaves similarly to the .NET Generic Host and exposes many of the same interfaces but requires less callbacks to configure. The ASP.NET Core is available only for backward compatibility. + +The following example instantiates a `WebApplication`: + +[!code-csharp[](~/fundamentals/startup/6.0_samples/WebAll/Program.cs?name=snippet2&highlight=7)] + +The [WebApplicationBuilder.Build](xref:Microsoft.AspNetCore.Builder.WebApplicationBuilder.Build%2A) method configures a host with a set of default options, such as: + +* Use [Kestrel](#servers) as the web server and enable IIS integration. +* Load [configuration](xref:fundamentals/configuration/index) from `appsettings.json`, environment variables, command line arguments, and other configuration sources. +* Send logging output to the console and debug providers. + +### Non-web scenarios + +The Generic Host allows other types of apps to use cross-cutting framework extensions, such as logging, dependency injection (DI), configuration, and app lifetime management. For more information, see and . + +## Servers + +An ASP.NET Core app uses an HTTP server implementation to listen for HTTP requests. The server surfaces requests to the app as a set of [request features](xref:fundamentals/request-features) composed into an `HttpContext`. + +# [Windows](#tab/windows) + +ASP.NET Core provides the following server implementations: + +* *Kestrel* is a cross-platform web server. Kestrel is often run in a reverse proxy configuration using [IIS](https://www.iis.net/). In ASP.NET Core 2.0 or later, Kestrel can be run as a public-facing edge server exposed directly to the Internet. +* *IIS HTTP Server* is a server for Windows that uses IIS. With this server, the ASP.NET Core app and IIS run in the same process. +* *HTTP.sys* is a server for Windows that isn't used with IIS. + +# [macOS](#tab/macos) + +ASP.NET Core provides the *Kestrel* cross-platform server implementation. In ASP.NET Core 2.0 or later, Kestrel can run as a public-facing edge server exposed directly to the Internet. Kestrel is often run in a reverse proxy configuration with [Nginx](https://nginx.org) or [Apache](https://httpd.apache.org/). + +# [Linux](#tab/linux) + +ASP.NET Core provides the *Kestrel* cross-platform server implementation. In ASP.NET Core 2.0 or later, Kestrel can run as a public-facing edge server exposed directly to the Internet. Kestrel is often run in a reverse proxy configuration with [Nginx](https://nginx.org) or [Apache](https://httpd.apache.org/). + +--- + +For more information, see . + +## Configuration + +ASP.NET Core provides a [configuration](xref:fundamentals/configuration/index) framework that gets settings as name-value pairs from an ordered set of configuration providers. Built-in configuration providers are available for a variety of sources, such as `.json` files, `.xml` files, environment variables, and command-line arguments. Write custom configuration providers to support other sources. + +By [default](xref:fundamentals/configuration/index#default), ASP.NET Core apps are configured to read from `appsettings.json`, environment variables, the command line, and more. When the app's configuration is loaded, values from environment variables override values from `appsettings.json`. + +For managing confidential configuration data such as passwords, .NET Core provides the [Secret Manager](xref:security/app-secrets#secret-manager). For production secrets, we recommend [Azure Key Vault](xref:security/key-vault-configuration). + +For more information, see . + +## Environments + +Execution environments, such as `Development`, `Staging`, and `Production`, are available in ASP.NET Core. Specify the environment an app is running in by setting the `ASPNETCORE_ENVIRONMENT` environment variable. ASP.NET Core reads that environment variable at app startup and stores the value in an `IWebHostEnvironment` implementation. This implementation is available anywhere in an app via dependency injection (DI). + +The following example configures the exception handler and [HTTP Strict Transport Security Protocol (HSTS)](xref:security/enforcing-ssl#http-strict-transport-security-protocol-hsts) middleware when ***not*** running in the `Development` environment: + +[!code-csharp[](~/fundamentals/startup/6.0_samples/WebAll/Program.cs?name=snippet&highlight=10-14)] + +For more information, see . + +## Logging + +ASP.NET Core supports a logging API that works with a variety of built-in and third-party logging providers. Available providers include: + +* Console +* Debug +* Event Tracing on Windows +* Windows Event Log +* TraceSource +* Azure App Service +* Azure Application Insights + +To create logs, resolve an service from dependency injection (DI) and call logging methods such as . For example: + +[!code-csharp[](~/fundamentals/index/samples/6.0/RazorPagesMovie/Pages/Movies/Index.cshtml.cs?name=snippet&highlight=3-10, 16-17)] + +For more information, see . + +## Routing + +A *route* is a URL pattern that is mapped to a handler. The handler is typically a Razor page, an action method in an MVC controller, or a middleware. ASP.NET Core routing gives you control over the URLs used by your app. + +The following code, generated by the ASP.NET Core web application template, calls : + +[!code-csharp[](~/fundamentals/startup/6.0_samples/WebAll/Program.cs?name=snippet4&highlight=17)] + +For more information, see . + +## Error handling + +ASP.NET Core has built-in features for handling errors, such as: + +* A developer exception page +* Custom error pages +* Static status code pages +* Startup exception handling + +For more information, see . + +## Make HTTP requests + +An implementation of `IHttpClientFactory` is available for creating `HttpClient` instances. The factory: + +* Provides a central location for naming and configuring logical `HttpClient` instances. For example, register and configure a *github* client for accessing GitHub. Register and configure a default client for other purposes. +* Supports registration and chaining of multiple delegating handlers to build an outgoing request middleware pipeline. This pattern is similar to ASP.NET Core's inbound middleware pipeline. The pattern provides a mechanism to manage cross-cutting concerns for HTTP requests, including caching, error handling, serialization, and logging. +* Integrates with *Polly*, a popular third-party library for transient fault handling. +* Manages the pooling and lifetime of underlying `HttpClientHandler` instances to avoid common DNS problems that occur when managing `HttpClient` lifetimes manually. +* Adds a configurable logging experience via for all requests sent through clients created by the factory. + +For more information, see . + +## Content root + +The content root is the base path for: + +* The executable hosting the app (*.exe*). +* Compiled assemblies that make up the app (*.dll*). +* Content files used by the app, such as: + * Razor files (`.cshtml`, `.razor`) + * Configuration files (`.json`, `.xml`) + * Data files (`.db`) +* The [Web root](#web-root), typically the *wwwroot* folder. + +During development, the content root defaults to the project's root directory. This directory is also the base path for both the app's content files and the [Web root](#web-root). Specify a different content root by setting its path when [building the host](#host). For more information, see [Content root](xref:fundamentals/host/generic-host#contentroot). + +## Web root + +The web root is the base path for public, static resource files, such as: + +* Stylesheets (`.css`) +* JavaScript (`.js`) +* Images (`.png`, `.jpg`) + +By default, static files are served only from the web root directory and its sub-directories. The web root path defaults to *{content root}/wwwroot*. Specify a different web root by setting its path when [building the host](#host). For more information, see [Web root](xref:fundamentals/host/generic-host#webroot). + +Prevent publishing files in *wwwroot* with the [\ project item](/visualstudio/msbuild/common-msbuild-project-items#content) in the project file. The following example prevents publishing content in *wwwroot/local* and its sub-directories: + +```xml + + + +``` + +In Razor `.cshtml` files, `~/` points to the web root. A path beginning with `~/` is referred to as a *virtual path*. + +For more information, see . + +## Additional resources + +* [WebApplicationBuilder source code](https://github.com/dotnet/aspnetcore/blob/v6.0.1/src/DefaultBuilder/src/WebApplicationBuilder.cs) + +:::moniker-end From a681ae87a04df527257dcaa39d450dad92f4c0bd Mon Sep 17 00:00:00 2001 From: Luke Latham <1622880+guardrex@users.noreply.github.com> Date: Thu, 14 Nov 2024 04:02:31 -0500 Subject: [PATCH 9/9] Add RendererInfo examples (#34116) --- aspnetcore/blazor/components/render-modes.md | 27 ++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/aspnetcore/blazor/components/render-modes.md b/aspnetcore/blazor/components/render-modes.md index 77bdf0e6a17b..e412321ec8f5 100644 --- a/aspnetcore/blazor/components/render-modes.md +++ b/aspnetcore/blazor/components/render-modes.md @@ -226,7 +226,30 @@ The Connecting to the assistant...

+} +else +{ + ... +} +``` + +Disable a button until a component is interactive: + +```razor + +``` + +Disable a form during prerendering and enable the form when the component is interactive: ```razor @@ -256,7 +279,7 @@ Components use these properties to render content depending on their location or } ``` -The next example shows how to render markup to support performing a regular HTML action if the component is statically rendered: +Render markup to support performing a regular HTML action if the component is statically rendered: ```razor @if (AssignedRenderMode is null)