diff --git a/.openpublishing.publish.config.json b/.openpublishing.publish.config.json index c3538c62f033..f38d1210be0b 100644 --- a/.openpublishing.publish.config.json +++ b/.openpublishing.publish.config.json @@ -47,8 +47,8 @@ "branch_mapping": {} }, { - "path_to_root": "xamarin-forms-samples", - "url": "https://github.com/xamarin/xamarin-forms-samples", + "path_to_root": "maui-samples", + "url": "https://github.com/dotnet/maui-samples", "branch": "main", "branch_mapping": {} }, @@ -93,4 +93,4 @@ "docs_build_engine": { "name": "docfx_v3" } -} \ No newline at end of file +} diff --git a/aspnetcore/blazor/components/prerender.md b/aspnetcore/blazor/components/prerender.md index ebf870ccea0a..baded2b265d4 100644 --- a/aspnetcore/blazor/components/prerender.md +++ b/aspnetcore/blazor/components/prerender.md @@ -166,7 +166,7 @@ Prerendering guidance is organized in the Blazor documentation by subject matter * [Stateful reconnection after prerendering](xref:blazor/components/lifecycle#stateful-reconnection-after-prerendering) * [Prerendering with JavaScript interop](xref:blazor/components/lifecycle#prerendering-with-javascript-interop): This section also appears in the two JS interop articles on calling JavaScript from .NET and calling .NET from JavaScript. * [Handle incomplete asynchronous actions at render](xref:blazor/components/lifecycle#handle-incomplete-asynchronous-actions-at-render): Guidance for delayed rendering due to long-running lifecycle tasks during prerendering on the server. - * [QuickGrid component sample app](xref:blazor/components/quickgrid#sample-app): The [**QuickGrid for Blazor** sample app](https://aspnet.github.io/quickgridsamples/) is hosted on GitHub Pages. The site loads fast thanks to static prerendering using the community-maintained [`BlazorWasmPrerendering.Build` GitHub project](https://github.com/jsakamoto/BlazorWasmPreRendering.Build). + * [`QuickGrid` component sample app](xref:blazor/components/quickgrid#sample-app): The [**QuickGrid for Blazor** sample app](https://aspnet.github.io/quickgridsamples/) is hosted on GitHub Pages. The site loads fast thanks to static prerendering using the community-maintained [`BlazorWasmPrerendering.Build` GitHub project](https://github.com/jsakamoto/BlazorWasmPreRendering.Build). * [Prerendering when integrating components into Razor Pages and MVC apps](xref:blazor/components/integration) * Authentication and authorization diff --git a/aspnetcore/blazor/components/quickgrid.md b/aspnetcore/blazor/components/quickgrid.md index fb83b8efb382..c9279079e4ce 100644 --- a/aspnetcore/blazor/components/quickgrid.md +++ b/aspnetcore/blazor/components/quickgrid.md @@ -1,5 +1,5 @@ --- -title: ASP.NET Core Blazor QuickGrid component +title: ASP.NET Core Blazor `QuickGrid` component author: guardrex description: The QuickGrid component is a Razor component for quickly and efficiently displaying data in tabular form. monikerRange: '>= aspnetcore-8.0' @@ -12,7 +12,7 @@ uid: blazor/components/quickgrid [!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. +The [`QuickGrid` component](xref:Microsoft.AspNetCore.Components.QuickGrid) 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. ## Package @@ -22,9 +22,9 @@ Add a package reference for the [`Microsoft.AspNetCore.Components.QuickGrid`](ht ## Sample app -For various `QuickGrid` demonstrations, see the [**QuickGrid for Blazor** sample app](https://aspnet.github.io/quickgridsamples/). The demo site is hosted on GitHub Pages. The site loads fast thanks to static prerendering using the community-maintained [`BlazorWasmPrerendering.Build` GitHub project](https://github.com/jsakamoto/BlazorWasmPreRendering.Build). +For various QuickGrid demonstrations, see the [**QuickGrid for Blazor** sample app](https://aspnet.github.io/quickgridsamples/). The demo site is hosted on GitHub Pages. The site loads fast thanks to static prerendering using the community-maintained [`BlazorWasmPrerendering.Build` GitHub project](https://github.com/jsakamoto/BlazorWasmPreRendering.Build). -## `QuickGrid` implementation +## QuickGrid implementation To implement a `QuickGrid` component: @@ -41,7 +41,7 @@ To implement a `QuickGrid` component: * : Optionally defines a value for `@key` on each rendered row. Typically, this is used to specify a unique identifier, such as a primary key value, for each data item. This allows the grid to preserve the association between row elements and data items based on their unique identifiers, even when the `TGridItem` instances are replaced by new copies (for example, after a new query against the underlying data store). If not set, the `@key` is the `TGridItem` instance. * : Defines how many additional items to render before and after the visible region to reduce rendering frequency during scrolling. While higher values can improve scroll smoothness by rendering more items off-screen, a higher value can also result in an increase in initial load times. Finding a balance based on your data set size and user experience requirements is recommended. The default value is 3. Only available when using . * : Optionally links this `TGridItem` instance with a model, causing the grid to fetch and render only the current page of data. This is normally used in conjunction with a component or some other UI logic that displays and updates the supplied instance. -* In the `QuickGrid` child content (), specify s, which represent `TGridItem` columns whose cells display values: +* In the QuickGrid child content (), specify s, which represent `TGridItem` columns whose cells display values: * : Defines the value to be displayed in this column's cells. * : Optionally specifies a format string for the value. Using requires the `TProp` type to implement . * : Indicates whether the data should be sortable by this column. The default value may vary according to the column type. For example, a is sorted if any parameter is specified. @@ -65,7 +65,7 @@ To implement a `QuickGrid` component: * : Only applicable when using . defines an expected height in pixels for each row, allowing the virtualization mechanism to fetch the correct number of items to match the display size and to ensure accurate scrolling. * : Optionally defines a value for `@key` on each rendered row. Typically, this is used to specify a unique identifier, such as a primary key value, for each data item. This allows the grid to preserve the association between row elements and data items based on their unique identifiers, even when the `TGridItem` instances are replaced by new copies (for example, after a new query against the underlying data store). If not set, the `@key` is the `TGridItem` instance. * : Optionally links this `TGridItem` instance with a model, causing the grid to fetch and render only the current page of data. This is normally used in conjunction with a component or some other UI logic that displays and updates the supplied instance. -* In the `QuickGrid` child content (), specify s, which represent `TGridItem` columns whose cells display values: +* In the QuickGrid child content (), specify s, which represent `TGridItem` columns whose cells display values: * : Defines the value to be displayed in this column's cells. * : Optionally specifies a format string for the value. Using requires the `TProp` type to implement . * : Indicates whether the data should be sortable by this column. The default value may vary according to the column type. For example, a is sorted if any parameter is specified. @@ -97,7 +97,7 @@ For Blazor Web Apps, the `QuickGrid` component must adopt an [interactive render Access the component in a browser at the relative path `/promotion-grid`. -There aren't current plans to extend `QuickGrid` with features that full-blown commercial grids tend to offer, for example, hierarchical rows, drag-to-reorder columns, or Excel-like range selections. If you require advanced features that you don't wish to develop on your own, continue using third-party grids. +There aren't current plans to extend QuickGrid with features that full-blown commercial grids tend to offer, for example, hierarchical rows, drag-to-reorder columns, or Excel-like range selections. If you require advanced features that you don't wish to develop on your own, continue using third-party grids. ## Sort by column @@ -109,7 +109,7 @@ Add `Sortable="true"` ( ``` -In the running app, sort the `QuickGrid` column by selecting the rendered column title. +In the running app, sort the QuickGrid column by selecting the rendered column title. ## Page items with a `Paginator` component @@ -428,9 +428,9 @@ The conve For more information on calling web APIs, see . -## `QuickGrid` scaffolder +## QuickGrid scaffolder -The `QuickGrid` scaffolder scaffolds Razor components with `QuickGrid` to display data from a database. +The QuickGrid scaffolder scaffolds Razor components with QuickGrid to display data from a database. The scaffolder generates basic Create, Read, Update, and Delete (CRUD) pages based on an Entity Framework Core data model. You can scaffold individual pages or all of the CRUD pages. You select the model class and the `DbContext`, optionally creating a new `DbContext` if needed. @@ -566,4 +566,4 @@ dotnet aspnet-codegenerator blazor -h --- -For an example use of the `QuickGrid` scaffolder, see . +For an example use of the QuickGrid scaffolder, see . diff --git a/aspnetcore/blazor/tutorials/movie-database-app/part-2.md b/aspnetcore/blazor/tutorials/movie-database-app/part-2.md index d5d06457903d..22ad93397510 100644 --- a/aspnetcore/blazor/tutorials/movie-database-app/part-2.md +++ b/aspnetcore/blazor/tutorials/movie-database-app/part-2.md @@ -289,7 +289,7 @@ The component files in the `MoviePages` folder are described in greater detail i ASP.NET Core is built with dependency injection, which is a software design pattern for achieving [Inversion of Control (IoC)](/dotnet/standard/modern-web-apps-azure-architecture/architectural-principles#dependency-inversion) between classes and their dependencies. Services, such as the EF Core database context, are registered with dependency injection during application startup. These services are injected into Razor components for use by the components. -The [`QuickGrid`](xref:Microsoft.AspNetCore.Components.QuickGrid) component is a Razor component for efficiently displaying data in tabular form. The scaffolder places a `QuickGrid` component in the `Index` component (`Components/Pages/Index.razor`) to display movie entities. Calling on the service collection adds an EF Core adapter for `QuickGrid` to recognize EF Core-supplied instances and to resolve database queries asynchronously for efficiency. +The [`QuickGrid` component](xref:Microsoft.AspNetCore.Components.QuickGrid) is a Razor component for efficiently displaying data in tabular form. The scaffolder places a `QuickGrid` component in the `Index` component (`Components/Pages/Index.razor`) to display movie entities. Calling on the service collection adds an EF Core adapter for QuickGrid to recognize EF Core-supplied instances and to resolve database queries asynchronously for efficiency. In combination with , captures database-related exceptions that can be resolved by using Entity Framework migrations. When these exceptions occur, an HTML response is generated with details about possible actions to resolve the issue. diff --git a/aspnetcore/blazor/tutorials/movie-database-app/part-3.md b/aspnetcore/blazor/tutorials/movie-database-app/part-3.md index 3d84efdf764e..396a2470e2f4 100644 --- a/aspnetcore/blazor/tutorials/movie-database-app/part-3.md +++ b/aspnetcore/blazor/tutorials/movie-database-app/part-3.md @@ -248,7 +248,7 @@ A link is rendered to navigate to the `Create` page at `/movies/create`:

``` -The [`QuickGrid`](xref:Microsoft.AspNetCore.Components.QuickGrid) component displays movie entities. The item provider is a `DbSet` obtained from the created database context () of the injected database context factory (`DbFactory`). For each movie entity, the component displays the movie's title, release date, genre, and price. A column also holds links to edit, see details, and delete each movie entity. +The [`QuickGrid` component](xref:Microsoft.AspNetCore.Components.QuickGrid) displays movie entities. The item provider is a `DbSet` obtained from the created database context () of the injected database context factory (`DbFactory`). For each movie entity, the component displays the movie's title, release date, genre, and price. A column also holds links to edit, see details, and delete each movie entity. ```razor @@ -286,7 +286,7 @@ Notice how the context (`Context`) parameter of the diff --git a/aspnetcore/blazor/tutorials/movie-database-app/part-6.md b/aspnetcore/blazor/tutorials/movie-database-app/part-6.md index 64b6ffbdd7ff..6025435cf6d2 100644 --- a/aspnetcore/blazor/tutorials/movie-database-app/part-6.md +++ b/aspnetcore/blazor/tutorials/movie-database-app/part-6.md @@ -19,7 +19,7 @@ This part of the tutorial series covers adding a search feature to the movies `I ## Implement a filter feature for the `QuickGrid` component -The [`QuickGrid`](xref:Microsoft.AspNetCore.Components.QuickGrid) component is used by the movie `Index` component (`Components/MoviePages/Index.razor`) to display movies from the database: +The [`QuickGrid` component](xref:Microsoft.AspNetCore.Components.QuickGrid) is used by the movie `Index` component (`Components/MoviePages/Index.razor`) to display movies from the database: ```razor @@ -47,7 +47,7 @@ private IQueryable FilteredMovies => `TitleFilter` is the filter string. The property is provided the [`[SupplyParameterFromQuery]` attribute](xref:Microsoft.AspNetCore.Components.SupplyParameterFromQueryAttribute), which lets Blazor know that the value of `TitleFilter` should be assigned from the query string when the query string contains a field of the same name (for example, `?titleFilter=road+warrior` yields a `TitleFilter` value of `road warrior`). Note that query string field names, such as `titleFilter`, aren't case sensitive. -The `FilteredMovies` property is an `IQueryable`, which is the type for assignment to the `QuickGrid`'s parameter. The property filters the list of movies based on the supplied `TitleFilter`. If a `TitleFilter` isn't assigned a value from the query string (`TitleFilter` is `null`), an empty string (`string.Empty`) is used for the clause. Therefore, no movies are filtered for display. +The `FilteredMovies` property is an `IQueryable`, which is the type for assignment to the QuickGrid's parameter. The property filters the list of movies based on the supplied `TitleFilter`. If a `TitleFilter` isn't assigned a value from the query string (`TitleFilter` is `null`), an empty string (`string.Empty`) is used for the clause. Therefore, no movies are filtered for display. Change the `QuickGrid` component's parameter to use the `movies` collection: diff --git a/aspnetcore/blazor/tutorials/movie-database-app/part-8.md b/aspnetcore/blazor/tutorials/movie-database-app/part-8.md index 18ba82a29f91..8a48f99e244b 100644 --- a/aspnetcore/blazor/tutorials/movie-database-app/part-8.md +++ b/aspnetcore/blazor/tutorials/movie-database-app/part-8.md @@ -89,7 +89,7 @@ To see how making a component interactive enhances the user experience, let's pr * Runs on the server. * Renders content interactively over the underlying SignalR connection. -## Add pagination to the `QuickGrid` +## Add pagination to the QuickGrid The `QuickGrid` component can page data from the database. @@ -125,7 +125,7 @@ Change ``` -You can sort the `QuickGrid` by movie title by selecting the **:::no-loc text="Title":::** column. The page doesn't reload for sorting to occur. The sorting is performed live over the SignalR connection, where the sorting operation is performed on the server with the rendered result sent back to the client: +You can sort the QuickGrid by movie title by selecting the **:::no-loc text="Title":::** column. The page doesn't reload for sorting to occur. The sorting is performed live over the SignalR connection, where the sorting operation is performed on the server with the rendered result sent back to the client: ![Movie list sorted by the Title column](~/blazor/tutorials/movie-database-app/part-8/_static/sorted-movies.png) @@ -189,9 +189,9 @@ In its place, add the following Razor markup: ``` -`@bind:event="oninput"` performs binding for the HTML's `oninput` event, which fires when the `` element's value is changed as a direct result of a user typing in the search box. The `QuickGrid` is bound to `FilteredMovies`. As `titleFilter` changes with the value of the search box, rerendering the `QuickGrid` bound to the `FilteredMovies` method filters movie entities based on the updated value of `titleFilter`. +`@bind:event="oninput"` performs binding for the HTML's `oninput` event, which fires when the `` element's value is changed as a direct result of a user typing in the search box. The QuickGrid is bound to `FilteredMovies`. As `titleFilter` changes with the value of the search box, rerendering the QuickGrid bound to the `FilteredMovies` method filters movie entities based on the updated value of `titleFilter`. -Run the app, type "`road warrior`" into the search field and notice how the `QuickGrid` is filtered for each character entered until *The Road Warrior* movie is left when the search field reaches "`road `" (":::no-loc text="road":::" followed by a space). +Run the app, type "`road warrior`" into the search field and notice how the QuickGrid is filtered for each character entered until *The Road Warrior* movie is left when the search field reaches "`road `" (":::no-loc text="road":::" followed by a space). ![Movie list filtered to 'The Road Warrior' movie when the search box reaches 'road ' ('road' followed by a space).](~/blazor/tutorials/movie-database-app/part-8/_static/filtered-to-road-warrior.png) diff --git a/aspnetcore/docfx.json b/aspnetcore/docfx.json index 3e95368880c8..408116c7b491 100644 --- a/aspnetcore/docfx.json +++ b/aspnetcore/docfx.json @@ -88,7 +88,7 @@ "**/tutorials/**/**.md": "tutorial" }, "no-loc": { - "**/**.md": [ "Blazor", "Blazor Hybrid", "Blazor Server", "Blazor WebAssembly", "Blazor Web App", "BREACH", "cookie", "Cookie", "CRIME", "EF Core", "Home" , "global.json", "Identity", "JS", "Kestrel", ".NET Aspire", ".NET MAUI", ".NET Multi-platform App UI", "Privacy" , "Razor", "REST", "SignalR", "Web View" ] + "**/**.md": [ "Blazor", "Blazor Hybrid", "Blazor Server", "Blazor WebAssembly", "Blazor Web App", "BREACH", "cookie", "Cookie", "CRIME", "EF Core", "Home" , "global.json", "Identity", "JS", "Kestrel", ".NET Aspire", ".NET MAUI", ".NET Multi-platform App UI", "Privacy", "QuickGrid", "Razor", "REST", "SignalR", "Web View" ] }, "recommendations": { "**/tutorials/**/**.md": "false" diff --git a/aspnetcore/fundamentals/servers/yarp/extensibility.md b/aspnetcore/fundamentals/servers/yarp/extensibility.md index 53a71b2843b8..8bbb34592540 100644 --- a/aspnetcore/fundamentals/servers/yarp/extensibility.md +++ b/aspnetcore/fundamentals/servers/yarp/extensibility.md @@ -21,7 +21,7 @@ There are 2 main styles of extensibility for YARP, depending on the routing beha YARP uses the concept of [Routes](xref:fundamentals/servers/yarp/config-files#routes), [Clusters](xref:fundamentals/servers/yarp/config-files#clusters) and Destinations. These can be supplied through [configuration files](xref:fundamentals/servers/yarp/config-files) or [directly through code](xref:fundamentals/servers/yarp/config-providers). Based on the routing rules, YARP picks a cluster and enumerates the possible destinations. It then uses the middleware pipeline to select the destination based on destination health, session affinity, load balancing etc. -![Image](https://github.com/user-attachments/assets/ff17a04f-0c3c-46c7-8ec2-a1ed3dbc948c) +![Middleware pipeline diagram](https://github.com/user-attachments/assets/ff17a04f-0c3c-46c7-8ec2-a1ed3dbc948c) Most of the pre-built pipeline modules can be customized through code. You can also change the pipeline definition to replace modules with your own implementation(s) or add additional modules as needed. @@ -31,7 +31,7 @@ For more information see [Middleware](xref:fundamentals/servers/yarp/middleware) If the YARP pipeline is too rigid for your needs, or the scale of routing rules and destinations is not suitable for loading into memory, then you can implement your own routing logic and use the HTTP Forwarder to direct requests to your chosen destination. The HttpForwarder component takes the HTTP context and forwards the request to the supplied destination. -![Image](https://github.com/user-attachments/assets/1a060a7e-fa43-49a4-bfad-f95d7d35be63) +![HTTP forwarder diagram](https://github.com/user-attachments/assets/1a060a7e-fa43-49a4-bfad-f95d7d35be63) The transform component can still be used with the forwarder is needed. diff --git a/aspnetcore/mobile/native-mobile-backend.md b/aspnetcore/mobile/native-mobile-backend.md index ed1292e5cb24..35c6ef478a66 100644 --- a/aspnetcore/mobile/native-mobile-backend.md +++ b/aspnetcore/mobile/native-mobile-backend.md @@ -3,44 +3,44 @@ title: Create backend services for native mobile apps with ASP.NET Core author: rick-anderson description: Learn how to create backend services using ASP.NET Core MVC to support native mobile apps. ms.author: riande -ms.date: 04/09/2024 +ms.date: 02/10/2025 uid: mobile/native-mobile-backend --- # Create backend services for native mobile apps with ASP.NET Core By [James Montemagno](https://twitter.com/JamesMontemagno) -Mobile apps can communicate with ASP.NET Core backend services. For instructions on connecting local web services from iOS simulators and Android emulators, see [Connect to Local Web Services from iOS Simulators and Android Emulators](/xamarin/cross-platform/deploy-test/connect-to-local-web-services). +Mobile apps can communicate with ASP.NET Core backend services. For instructions on connecting local web services from iOS simulators and Android emulators, see [Connect to local web services from Android emulators and iOS simulators](/dotnet/maui/data-cloud/local-web-services). -[View or download sample backend services code](https://github.com/xamarin/xamarin-forms-samples/tree/main/WebServices/TodoREST) +[View or download sample backend services code](https://github.com/dotnet/maui-samples/tree/main/9.0/WebServices/TodoREST) -## The Sample Native Mobile App +## The sample native mobile app -This tutorial demonstrates how to create backend services using ASP.NET Core to support native mobile apps. It uses the [Xamarin.Forms TodoRest app](/xamarin/xamarin-forms/data-cloud/consuming/rest) as its native client, which includes separate native clients for Android, iOS, and Windows. You can follow the linked tutorial to create the native app (and install the necessary free Xamarin tools), and download the Xamarin sample solution. The Xamarin sample includes an ASP.NET Core Web API services project, which this article's ASP.NET Core app replaces (with no changes required by the client). +This tutorial demonstrates how to create backend services using ASP.NET Core to support native mobile apps. It uses a [.NET MAUI app](/samples/dotnet/maui-samples/webservices-rest/) as its native client. The sample includes an ASP.NET Core Web API services project, which this article shows how to build. ![To Do Rest application running on an Android smartphone](native-mobile-backend/_static/todo-android.png) ### Features -The [TodoREST app](https://github.com/xamarin/xamarin-forms-samples/tree/main/WebServices/TodoREST) supports listing, adding, deleting, and updating To-Do items. Each item has an ID, a Name, Notes, and a property indicating whether it's been Done yet. +The [TodoREST app](https://github.com/dotnet/maui-samples/tree/main/9.0/WebServices/TodoREST) supports listing, adding, deleting, and updating todo items. Each item has an ID, a name, notes, and a property indicating whether it's been done yet. In the previous example, The main view of the items lists each item's name and indicates if it's done with a checkmark. -Tapping the `+` icon opens an add item dialog: +Tapping the `+` icon navigates to the add item page: ![Add item dialog](native-mobile-backend/_static/todo-android-new-item.png) -Tapping an item on the main list screen opens up an edit dialog where the item's Name, Notes, and Done settings can be modified, or the item can be deleted: +Tapping an item on the main page navigates to an edit page where the item's name, notes, and done settings can be modified, or the item can be deleted: ![Edit item dialog](native-mobile-backend/_static/todo-android-edit-item.png) -To test it out yourself against the ASP.NET Core app created in the next section running on your computer, update the app's [`RestUrl`](https://github.com/xamarin/xamarin-forms-samples/blob/main/WebServices/TodoREST/TodoREST/Constants.cs#L13) constant. +To test it out yourself against the ASP.NET Core app created in the next section, if you host it online, update the app's [`RestUrl`](https://github.com/dotnet/maui-samples/blob/52607dc4ebf19a51ce59694b57e704b67600f69b/9.0/WebServices/TodoREST/TodoREST/Constants.cs#L6) constant. Otherwise, the app will communicate with the ASP.NET Core app that's hosted locally on your machine. -Android emulators don't run on the local machine and use a loopback IP (10.0.2.2) to communicate with the local machine. Use [Xamarin.Essentials DeviceInfo](/xamarin/essentials/device-information/) to detect what operating the system is running to use the correct URL. +Android emulators don't run on the local machine and use a loopback IP (10.0.2.2) to communicate with the local machine. Use .NET MAUI's [DeviceInfo](/dotnet/maui/platform-integration/device/information) class to detect the operating system the app is running on to use the correct URL. -Navigate to the [`TodoREST`](https://github.com/xamarin/xamarin-forms-samples/tree/main/WebServices/TodoREST/TodoREST) project and open the [`Constants.cs`](https://github.com/xamarin/xamarin-forms-samples/blob/main/WebServices/TodoREST/TodoREST/Constants.cs) file. The `Constants.cs` file contains the following configuration. +Navigate to the [`TodoREST`](https://github.com/dotnet/maui-samples/tree/main/9.0/WebServices/TodoREST) project and open the [`Constants.cs`](https://github.com/dotnet/maui-samples/blob/main/9.0/WebServices/TodoREST/TodoREST/Constants.cs) file. The `Constants.cs` file contains the following configuration. -:::code language="csharp" source="~/../xamarin-forms-samples/WebServices/TodoREST/TodoREST/Constants.cs" highlight="13"::: +:::code language="csharp" source="~/../maui-samples/9.0/WebServices/TodoREST/TodoREST/Constants.cs" highlight="10"::: You can optionally deploy the web service to a cloud service such as Azure and update the `RestUrl`. @@ -50,36 +50,34 @@ Create a new ASP.NET Core Web Application in Visual Studio. Choose the Web API t ![New ASP.NET Web Application dialog with Web API project template selected](native-mobile-backend/_static/web-api-template.png) -The app should respond to all requests made to port 5000 including clear-text HTTP traffic for our mobile client. Update `Startup.cs` so doesn't run in development: - -:::code language="csharp" source="~/../xamarin-forms-samples/WebServices/TodoREST/TodoAPI/TodoAPI/Startup.cs" id="snippet" highlight="7-11"::: +The app should respond to all requests made over HTTPS to port 5001. > [!NOTE] > Run the app directly, rather than behind IIS Express. IIS Express ignores non-local requests by default. Run [dotnet run](/dotnet/core/tools/dotnet-run) from a command prompt, or choose the app name profile from the Debug Target dropdown in the Visual Studio toolbar. -Add a model class to represent To-Do items. Mark required fields with the `[Required]` attribute: +Add a model class to represent todo items. Mark required fields with the `[Required]` attribute: -:::code language="csharp" source="~/../xamarin-forms-samples/WebServices/TodoREST/TodoAPI/TodoAPI/Models/TodoItem.cs"::: +:::code language="csharp" source="~/../maui-samples/9.0/WebServices/TodoREST/TodoAPI/Models/TodoItem.cs"::: -The API methods require some way to work with data. Use the same `ITodoRepository` interface the original Xamarin sample uses: +API methods require defining to work with data. Use the same `ITodoRepository` interface the sample uses: -:::code language="csharp" source="~/../xamarin-forms-samples/WebServices/TodoREST/TodoAPI/TodoAPI/Interfaces/ITodoRepository.cs"::: +:::code language="csharp" source="~/../maui-samples/9.0/WebServices/TodoREST/TodoAPI/Interfaces/ITodoRepository.cs"::: -For this sample, the implementation just uses a private collection of items: +For this sample, the repository implementation just uses a private collection of items: -:::code language="csharp" source="~/../xamarin-forms-samples/WebServices/TodoREST/TodoAPI/TodoAPI/Services/TodoRepository.cs"::: +:::code language="csharp" source="~/../maui-samples/9.0/WebServices/TodoREST/TodoAPI/Services/TodoRepository.cs"::: -Configure the implementation in `Startup.cs`: +Configure the implementation in `Program.cs`: -:::code language="csharp" source="~/../xamarin-forms-samples/WebServices/TodoREST/TodoAPI/TodoAPI/Startup.cs" id="snippet2" highlight="3"::: +:::code language="csharp" source="~/../maui-samples/9.0/WebServices/TodoREST/TodoAPI/Program.cs" highlight="5"::: ## Creating the Controller -Add a new controller to the project, [TodoItemsController](https://github.com/xamarin/xamarin-forms-samples/tree/main/WebServices/TodoREST/TodoAPI/TodoAPI/Controllers/TodoItemsController.cs). It should inherit from . Add a `Route` attribute to indicate that the controller handles requests made to paths starting with `api/todoitems`. The `[controller]` token in the route is replaced by the name of the controller (omitting the `Controller` suffix), and is especially helpful for global routes. Learn more about [routing](../fundamentals/routing.md). +Add a new controller to the project, [TodoItemsController](https://github.com/dotnet/maui-samples/blob/main/9.0/WebServices/TodoREST/TodoAPI/Controllers/TodoItemsController.cs). It should inherit from . Add a `Route` attribute to indicate that the controller handles requests made to paths starting with `api/todoitems`. The `[controller]` token in the route is replaced by the name of the controller (omitting the `Controller` suffix), and is especially helpful for global routes. Learn more about [routing](../fundamentals/routing.md). The controller requires an `ITodoRepository` to function; request an instance of this type through the controller's constructor. At runtime, this instance is provided using the framework's support for [dependency injection](../fundamentals/dependency-injection.md). -:::code language="csharp" source="~/../xamarin-forms-samples/WebServices/TodoREST/TodoAPI/TodoAPI/Controllers/TodoItemsController.cs" id="snippetDI"::: +:::code language="csharp" source="~/../maui-samples/9.0/WebServices/TodoREST/TodoAPI/Controllers/TodoItemsController.cs" id="snippetDI"::: This API supports four different HTTP verbs to perform CRUD (Create, Read, Update, Delete) operations on the data source. The simplest of these is the Read operation, which corresponds to an HTTP `GET` request. @@ -130,32 +128,31 @@ For more details on jq installation, see [jq](https://jqlang.github.io/jq/downlo --- -### Reading Items +### Reading items Requesting a list of items is done with a GET request to the `List` method. The `[HttpGet]` attribute on the `List` method indicates that this action should only handle GET requests. The route for this action is the route specified on the controller. You don't necessarily need to use the action name as part of the route. You just need to ensure each action has a unique and unambiguous route. Routing attributes can be applied at both the controller and method levels to build up specific routes. -:::code language="csharp" source="~/../xamarin-forms-samples/WebServices/TodoREST/TodoAPI/TodoAPI/Controllers/TodoItemsController.cs" id="snippet"::: +:::code language="csharp" source="~/../maui-samples/9.0/WebServices/TodoREST/TodoAPI/Controllers/TodoItemsController.cs" id="snippet"::: # [macOS](#tab/macos) In the terminal, call the following curl command: ```Bash - curl -v -X GET 'http://localhost:5000/api/todoitems/' | jq + curl -v -X GET 'https://localhost:5001/api/todoitems/' | jq ``` # [Windows](#tab/windows) > [!NOTE] -> Windows PowerShell 5.1 recognizes `curl` as an alias to `Invoke-WebRequst`. To use `curl.exe` instead, type the `&` operator followed by the full path to `curl.exe`. Find the full path to `curl.exe` by typing `where curl` in the Command Prompt. +> Windows PowerShell 5.1 recognizes `curl` as an alias to `Invoke-WebRequst`. To use `curl.exe` instead, type the `&` operator followed by the full path to `curl.exe`. Find the full path to `curl.exe` by typing `where curl` in the Command Prompt. >For example, if the full path to `curl.exe` is `C:\Windows\System32\curl.exe`. Then instead of typing the command `curl --help`, use `& 'C:\Windows\System32\curl.exe' --help`. >PowerShell 7 uses `curl` as the command for `curl.exe` and so a full path is not required. - In PowerShell, call the following curl command: ```powershell - curl -v -X GET 'http://localhost:5000/api/todoitems/' | jq + curl -v -X GET 'https://localhost:5001/api/todoitems/' | jq ``` --- @@ -164,10 +161,9 @@ The previous curl command includes the following components: * `-v`: Activates verbose mode, providing detailed information about the HTTP response and is useful for API testing and troubleshooting. * `-X GET`: Specifies the use of the HTTP `GET` method for the request. While curl can often infer the intended HTTP method, this option makes it explicit. -* `'http://localhost:5000/api/todoitems/'`: This is the request’s target URL. In this instance, it’s a REST API endpoint. +* `'https://localhost:5001/api/todoitems/'`: This is the request’s target URL. In this instance, it’s a REST API endpoint. * `| jq`: This segment isn’t related to curl directly. The pipe `|` is a shell operator that takes the output from the command on its left and “pipes” it to the command on its right. `jq` is a command-line JSON processor. While not required, `jq` makes the returned JSON data easier to read. - The `List` method returns a 200 OK response code and all of the Todo items, serialized as JSON: ```output @@ -181,7 +177,7 @@ The `List` method returns a 200 OK response code and all of the Todo items, seri { "id": "b94afb54-a1cb-4313-8af3-b7511551b33b", "name": "Develop apps", - "notes": "Use Visual Studio and Visual Studio for Mac", + "notes": "Use Visual Studio and Visual Studio Code", "done": false }, { @@ -193,25 +189,24 @@ The `List` method returns a 200 OK response code and all of the Todo items, seri ] ``` -### Creating Items +### Creating items By convention, creating new data items is mapped to the HTTP `POST` verb. The `Create` method has an `[HttpPost]` attribute applied to it and accepts a `TodoItem` instance. Since the `item` argument is passed in the body of the POST, this parameter specifies the `[FromBody]` attribute. Inside the method, the item is checked for validity and prior existence in the data store, and if no issues occur, it's added using the repository. Checking `ModelState.IsValid` performs [model validation](../mvc/models/validation.md), and should be done in every API method that accepts user input. -:::code language="csharp" source="~/../xamarin-forms-samples/WebServices/TodoREST/TodoAPI/TodoAPI/Controllers/TodoItemsController.cs" id="snippetCreate"::: +:::code language="csharp" source="~/../maui-samples/9.0/WebServices/TodoREST/TodoAPI/Controllers/TodoItemsController.cs" id="snippetCreate"::: The sample uses an `enum` containing error codes that are passed to the mobile client: -:::code language="csharp" source="~/../xamarin-forms-samples/WebServices/TodoREST/TodoAPI/TodoAPI/Controllers/TodoItemsController.cs" id="snippetErrorCode"::: - +:::code language="csharp" source="~/../maui-samples/9.0/WebServices/TodoREST/TodoAPI/Controllers/TodoItemsController.cs" id="snippetErrorCode"::: In the terminal, test adding new items by calling the following curl command using the `POST` verb and providing the new object in JSON format in the Body of the request. # [macOS](#tab/macos) ```Bash -curl -v -X POST 'http://localhost:5000/api/todoitems/' \ +curl -v -X POST 'https://localhost:5001/api/todoitems/' \ --header 'Content-Type: application/json' \ --data '{ "id": "6bb8b868-dba1-4f1a-93b7-24ebce87e243", @@ -224,7 +219,7 @@ curl -v -X POST 'http://localhost:5000/api/todoitems/' \ # [Windows](#tab/windows) ```powershell -curl -v -X POST 'http://localhost:5000/api/todoitems/' ` +curl -v -X POST 'https://localhost:5001/api/todoitems/' ` --header 'Content-Type: application/json' ` --data '{ "id": "6bb8b868-dba1-4f1a-93b7-24ebce87e243", @@ -243,18 +238,18 @@ The previous curl command includes the following options: The method returns the newly created item in the response. -### Updating Items +### Updating items -Modifying records is done using HTTP `PUT` requests. Other than this change, the `Edit` method is almost identical to `Create`. If the record isn't found, the `Edit` action returns a `NotFound` (404) response. +Modifying records is achieved using HTTP `PUT` requests. Other than this change, the `Edit` method is almost identical to `Create`. If the record isn't found, the `Edit` action returns a `NotFound` (404) response. -:::code language="csharp" source="~/../xamarin-forms-samples/WebServices/TodoREST/TodoAPI/TodoAPI/Controllers/TodoItemsController.cs" id="snippetEdit"::: +:::code language="csharp" source="~/../maui-samples/9.0/WebServices/TodoREST/TodoAPI/Controllers/TodoItemsController.cs" id="snippetEdit"::: To test with curl, change the verb to `PUT`. Specify the updated object data in the Body of the request. # [macOS](#tab/macos) ```Bash -curl -v -X PUT 'http://localhost:5000/api/todoitems/' \ +curl -v -X PUT 'https://localhost:5001/api/todoitems/' \ --header 'Content-Type: application/json' \ --data '{ "id": "6bb8b868-dba1-4f1a-93b7-24ebce87e243", @@ -266,7 +261,7 @@ curl -v -X PUT 'http://localhost:5000/api/todoitems/' \ # [Windows](#tab/windows) ```powershell -curl -v -X PUT 'http://localhost:5000/api/todoitems/' ` +curl -v -X PUT 'https://localhost:5001/api/todoitems/' ` --header 'Content-Type: application/json' ` --data '{ "id": "6bb8b868-dba1-4f1a-93b7-24ebce87e243", @@ -277,25 +272,26 @@ curl -v -X PUT 'http://localhost:5000/api/todoitems/' ` ``` --- + This method returns a `NoContent` (204) response when successful, for consistency with the pre-existing API. -### Deleting Items +### Deleting items Deleting records is accomplished by making `DELETE` requests to the service, and passing the ID of the item to be deleted. As with updates, requests for items that don't exist receive `NotFound` responses. Otherwise, a successful request returns a `NoContent` (204) response. -:::code language="csharp" source="~/../xamarin-forms-samples/WebServices/TodoREST/TodoAPI/TodoAPI/Controllers/TodoItemsController.cs" id="snippetDelete"::: +:::code language="csharp" source="~/../maui-samples/9.0/WebServices/TodoREST/TodoAPI/Controllers/TodoItemsController.cs" id="snippetDelete"::: Test with curl by changing the HTTP verb to `DELETE` and appending the ID of the data object to delete at the end of the URL. Nothing is required in the Body of the request. # [macOS](#tab/macos) ```Bash -curl -v -X DELETE 'http://localhost:5000/api/todoitems/6bb8b868-dba1-4f1a-93b7-24ebce87e243' +curl -v -X DELETE 'https://localhost:5001/api/todoitems/6bb8b868-dba1-4f1a-93b7-24ebce87e243' ``` # [Windows](#tab/windows) ```powershell -curl -v -X DELETE 'http://localhost:5000/api/todoitems/6bb8b868-dba1-4f1a-93b7-24ebce87e243' +curl -v -X DELETE 'https://localhost:5001/api/todoitems/6bb8b868-dba1-4f1a-93b7-24ebce87e243' ``` --- @@ -313,15 +309,14 @@ A DTO may be used to: To demonstrate the DTO approach, see [Prevent over-posting](xref:tutorials/first-web-api#prevent-over-posting) -## Common Web API Conventions +## Common Web API conventions As you develop the backend services for your app, you'll want to come up with a consistent set of conventions or policies for handling cross-cutting concerns. For example, in the service shown previously, requests for specific records that weren't found received a `NotFound` response, rather than a `BadRequest` response. Similarly, commands made to this service that passed in model bound types always checked `ModelState.IsValid` and returned a `BadRequest` for invalid model types. Once you've identified a common policy for your APIs, you can usually encapsulate it in a [filter](../mvc/controllers/filters.md). Learn more about [how to encapsulate common API policies in ASP.NET Core MVC applications](/archive/msdn-magazine/2016/august/asp-net-core-real-world-asp-net-core-mvc-filters). -## Additional resources +## See also -- [Xamarin.Forms: Web Service Authentication](/xamarin/xamarin-forms/data-cloud/authentication/) -- [Xamarin.Forms: Consume a RESTful Web Service](/xamarin/xamarin-forms/data-cloud/web-services/rest) -- [Consume REST web services in Xamarin Apps](/training/modules/consume-rest-services/) -- [Create a web API with ASP.NET Core](/training/modules/build-web-api-aspnet-core/) +- [.NET MAUI: Consume a REST-based web service](/dotnet/maui/data-cloud/rest/) +- [Consume REST web services in .NET MAUI apps](/training/modules/consume-rest-services-maui/) +- [Create a web API with ASP.NET Core controllers](/training/modules/build-web-api-aspnet-core/) diff --git a/aspnetcore/mobile/native-mobile-backend/_static/todo-android-edit-item.png b/aspnetcore/mobile/native-mobile-backend/_static/todo-android-edit-item.png index 480f442b0be9..41dd2aa3c718 100644 Binary files a/aspnetcore/mobile/native-mobile-backend/_static/todo-android-edit-item.png and b/aspnetcore/mobile/native-mobile-backend/_static/todo-android-edit-item.png differ diff --git a/aspnetcore/mobile/native-mobile-backend/_static/todo-android-new-item.png b/aspnetcore/mobile/native-mobile-backend/_static/todo-android-new-item.png index 59f7e7b49685..4e2397c3570b 100644 Binary files a/aspnetcore/mobile/native-mobile-backend/_static/todo-android-new-item.png and b/aspnetcore/mobile/native-mobile-backend/_static/todo-android-new-item.png differ diff --git a/aspnetcore/mobile/native-mobile-backend/_static/todo-android.png b/aspnetcore/mobile/native-mobile-backend/_static/todo-android.png index ad6007d9b135..4e4edd7b814a 100644 Binary files a/aspnetcore/mobile/native-mobile-backend/_static/todo-android.png and b/aspnetcore/mobile/native-mobile-backend/_static/todo-android.png differ diff --git a/aspnetcore/mobile/native-mobile-backend/_static/web-api-template.png b/aspnetcore/mobile/native-mobile-backend/_static/web-api-template.png index e5ede44c9871..b45e85bd19dc 100644 Binary files a/aspnetcore/mobile/native-mobile-backend/_static/web-api-template.png and b/aspnetcore/mobile/native-mobile-backend/_static/web-api-template.png differ diff --git a/aspnetcore/release-notes/aspnetcore-10.0.md b/aspnetcore/release-notes/aspnetcore-10.0.md index 3c8422189e58..c3927a3fd154 100644 --- a/aspnetcore/release-notes/aspnetcore-10.0.md +++ b/aspnetcore/release-notes/aspnetcore-10.0.md @@ -29,12 +29,16 @@ This section describes new features for SignalR. This section describes new features for minimal APIs. +## OpenAPI + +This section describes new features for OpenAPI. + ## Authentication and authorization This section describes new features for authentication and authorization. ## Miscellaneous -This section describes miscellaneous new features in ASP.NET Core 9. +This section describes miscellaneous new features in ASP.NET Core 10.0. ## Related content diff --git a/aspnetcore/release-notes/aspnetcore-10/includes/openApi.md b/aspnetcore/release-notes/aspnetcore-10/includes/openApi.md new file mode 100644 index 000000000000..13ab72d7e097 --- /dev/null +++ b/aspnetcore/release-notes/aspnetcore-10/includes/openApi.md @@ -0,0 +1,98 @@ +### OpenAPI 3.1 support + +https://github.com/dotnet/aspnetcore/pull/59480 +https://github.com/dotnet/aspnetcore/pull/60002 + +ASP.NET Core has added support for generating [OpenAPI version 3.1] documents in .NET 10. +Despite the minor version bump, OpenAPI 3.1 is a significant update to the OpenAPI specification, +in particular with full support for [JSON Schema draft 2020-12]. + +[OpenAPI version 3.1]: https://spec.openapis.org/oas/v3.1.1.html +[JSON Schema draft 2020-12]: https://json-schema.org/specification-links#2020-12 + +Some of the changes you will see in the generated OpenAPI document include: +- Nullable types will no longer have the `nullable: true` property in the schema, and instead will have a `type` keyword whose value is an array that includes `null` as one of the types. + +With this feature, the default OpenAPI version for generated documents will be 3.1, but you can easily change this +by explicitly setting the `OpenApiVersion` property of the `OpenApiOptions` in the `configureOptions` delegate +parameter of `AddOpenApi`. + +```csharp +builder.Services.AddOpenApi(options => +{ + // Specify the OpenAPI version to use. + options.OpenApiVersion = Microsoft.OpenApi.OpenApiSpecVersion.OpenApi3_0; +}); +``` + +If you are generating the OpenAPI document at build time, you can select the OpenAPI version by setting the `--openapi-version` in the `OpenApiGenerateDocumentsOptions` MSBuild item. + +```xml + + --openapi-version OpenApi3_0 +``` + +### Breaking changes + +Support for OpenAPI 3.1 requires an update to the underlying OpenAPI.NET library to a new major version, 2.0. +This new version has some breaking changes from the previous version, and this may impact your applications +if you have any document, operation, or schema transformers. +Perhaps the most significant change is that the `OpenApiAny` class has been dropped in favor of using `JsonNode` directly. +If your transformers use `OpenApiAny`, you will need to update them to use `JsonNode` instead. +For example, a schema transformer to add an example in .NET 9 might look like this: + +```csharp + options.AddSchemaTransformer((schema, context, cancellationToken) => + { + if (context.JsonTypeInfo.Type == typeof(WeatherForecast)) + { + schema.Example = new OpenApiObject + { + ["date"] = new OpenApiString(DateTime.Now.AddDays(1).ToString("yyyy-MM-dd")), + ["temperatureC"] = new OpenApiInteger(0), + ["temperatureF"] = new OpenApiInteger(32), + ["summary"] = new OpenApiString("Bracing"), + }; + } + return Task.CompletedTask; + }); +``` + +In .NET 10 the transformer to do the same task will look like this: + +```csharp + options.AddSchemaTransformer((schema, context, cancellationToken) => + { + if (context.JsonTypeInfo.Type == typeof(WeatherForecast)) + { + schema.Example = new JsonObject + { + ["date"] = DateTime.Now.AddDays(1).ToString("yyyy-MM-dd"), + ["temperatureC"] = 0, + ["temperatureF"] = 32, + ["summary"] = "Bracing", + }; + } + return Task.CompletedTask; + }); +``` + +Note that these changes will be necessary even if you congfigure the OpenAPI version to 3.0. + +### OpenAPI in Yaml + +https://github.com/dotnet/aspnetcore/pull/58616 + +ASP.NET now supports serving the generated OpenAPI document in YAML format. +YAML can be more concise than JSON, eliminating curly braces and quotation marks when these can be inferred. +YAML also supports multi-line strings, which can be useful for long descriptions. + +To configure your application to serve the generated OpenAPI document in YAML format, +specify the endpoint in the MapOpenApi call with a ".yaml" or ".yml" suffix, as shown in this example: + +```csharp +app.MapOpenApi("/openapi/{documentName}.yaml"); +``` + +Support for YAML is currently only available for the the OpenAPI served from the OpenAPI endpoint. +Support for generating OpenAPI documents in YAML format at build time will be added in a future preview. diff --git a/aspnetcore/release-notes/aspnetcore-10/includes/responseDescProducesResponseType.md b/aspnetcore/release-notes/aspnetcore-10/includes/responseDescProducesResponseType.md new file mode 100644 index 000000000000..3dd6d3874773 --- /dev/null +++ b/aspnetcore/release-notes/aspnetcore-10/includes/responseDescProducesResponseType.md @@ -0,0 +1,23 @@ +### Response description on ProducesResponseType + +https://github.com/dotnet/aspnetcore/pull/58193 + +The ProducesAttribute, ProducesResponseTypeAttribute, and ProducesDefaultResponseType attributes now accept an optional string parameter, `Description`, that will set the description of the response. Here's an example: + +```csharp +[HttpGet(Name = "GetWeatherForecast")] +[ProducesResponseType>(StatusCodes.Status200OK, Description = "The weather forecast for the next 5 days.")] +public IEnumerable Get() +{ +``` + +And the generated OpenAPI will be + +```json + "responses": { + "200": { + "description": "The weather forecast for the next 5 days.", + "content": { +``` + +Community contribution! 🙏 \ No newline at end of file diff --git a/aspnetcore/release-notes/aspnetcore-10/includes/testAppsTopLevel.md b/aspnetcore/release-notes/aspnetcore-10/includes/testAppsTopLevel.md new file mode 100644 index 000000000000..7894fdd0c15e --- /dev/null +++ b/aspnetcore/release-notes/aspnetcore-10/includes/testAppsTopLevel.md @@ -0,0 +1,17 @@ +## Better support for testing apps with top-level statements + +https://github.com/dotnet/aspnetcore/pull/58199 +https://github.com/dotnet/aspnetcore/pull/58482 + +.NET 10 now has better support for testing apps that use top-level statements. +Previously developers had to manually add `public partial class Program` to the +Program.cs file so that the test project could reference the Program class. +This is because the top-level statement feature in C# 9 generated a Program class +that was declared as internal. + +In .NET 10, a source generator is used to generate the `public partial class Program` +declaration if the programmer did not declare it explicitly. In addition, an analyzer +was added to detect when `public partial class Program` is declared explicitly and +advise the developer to remove it. + +![Image](https://github.com/user-attachments/assets/a37f0c81-a58a-453f-8da5-fa49356ca180) \ No newline at end of file diff --git a/aspnetcore/toc.yml b/aspnetcore/toc.yml index ce4f7b10c395..d28efd245c97 100644 --- a/aspnetcore/toc.yml +++ b/aspnetcore/toc.yml @@ -1096,6 +1096,9 @@ items: - name: Overview displayName: kestrel, iis, http.sys, httpsys, servers uid: fundamentals/servers/index + - name: HTTP.sys + displayName: deploy, publish, server, httpsys + uid: fundamentals/servers/httpsys - name: Kestrel items: - name: Overview @@ -1175,9 +1178,6 @@ items: - name: HTTP/3 displayName: deploy, publish, server, iis uid: host-and-deploy/iis/http3 - - name: HTTP.sys - displayName: deploy, publish, server, httpsys - uid: fundamentals/servers/httpsys - name: YARP items: - name: Get started with YARP @@ -1259,7 +1259,7 @@ items: uid: fundamentals/servers/yarp/websockets - name: Extensibility items: - - name: Extensibility + - name: Overview displayName: yarp uid: fundamentals/servers/yarp/extensibility - name: Middleware @@ -2073,4 +2073,4 @@ items: - name: API reference href: /dotnet/api/ - name: Contribute - href: https://github.com/dotnet/AspNetCore.Docs/blob/main/CONTRIBUTING.md \ No newline at end of file + href: https://github.com/dotnet/AspNetCore.Docs/blob/main/CONTRIBUTING.md