From 4c86a22eb2b9853b7b751a797fbcbe2e886607d5 Mon Sep 17 00:00:00 2001 From: Chris Martinez Date: Mon, 10 Aug 2026 13:15:12 -0700 Subject: [PATCH 1/6] Delete dead, unused file --- .../WebApi/src/Asp.Versioning.Grpc.ApiExplorer/Aot.cs | 8 -------- 1 file changed, 8 deletions(-) delete mode 100644 src/AspNetCore/WebApi/src/Asp.Versioning.Grpc.ApiExplorer/Aot.cs diff --git a/src/AspNetCore/WebApi/src/Asp.Versioning.Grpc.ApiExplorer/Aot.cs b/src/AspNetCore/WebApi/src/Asp.Versioning.Grpc.ApiExplorer/Aot.cs deleted file mode 100644 index 8d2e1cae..00000000 --- a/src/AspNetCore/WebApi/src/Asp.Versioning.Grpc.ApiExplorer/Aot.cs +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. - -namespace Asp.Versioning; - -internal static class Aot -{ - internal const string TrimmingMessage = "The API Explorer does not currently support trimming or native AOT. https://aka.ms/aspnet/trimming"; -} \ No newline at end of file From 838bff806c74d6db9e90a24e306ed2c40a0870c8 Mon Sep 17 00:00:00 2001 From: Chris Martinez Date: Mon, 10 Aug 2026 13:15:22 -0700 Subject: [PATCH 2/6] Fix text --- wiki/src/diagnostic/av0001.md | 2 +- wiki/src/diagnostic/av0002.md | 2 +- wiki/src/diagnostic/av0003.md | 2 +- wiki/src/diagnostic/av0004.md | 2 +- wiki/src/diagnostic/av0005.md | 2 +- wiki/src/diagnostic/av0006.md | 2 +- wiki/src/diagnostic/av0007.md | 2 +- wiki/src/diagnostic/av0008.md | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/wiki/src/diagnostic/av0001.md b/wiki/src/diagnostic/av0001.md index 0c48c25f..33d3049d 100644 --- a/wiki/src/diagnostic/av0001.md +++ b/wiki/src/diagnostic/av0001.md @@ -28,7 +28,7 @@ public class ExampleController : ControllerBase } ``` -The text `"abc"` is not a valid API version. This would not detected until runtime. +The text `"abc"` is not a valid API version. This would not be detected until runtime. ## How to Fix Violations diff --git a/wiki/src/diagnostic/av0002.md b/wiki/src/diagnostic/av0002.md index b15f5ac9..c379c9e6 100644 --- a/wiki/src/diagnostic/av0002.md +++ b/wiki/src/diagnostic/av0002.md @@ -30,7 +30,7 @@ public class Person } ``` -The text `")2.0,]"` is not a valid API version range. This would not detected until runtime. +The text `")2.0,]"` is not a valid API version range. This would not be detected until runtime. ## How to Fix Violations diff --git a/wiki/src/diagnostic/av0003.md b/wiki/src/diagnostic/av0003.md index d17eb861..366da1a6 100644 --- a/wiki/src/diagnostic/av0003.md +++ b/wiki/src/diagnostic/av0003.md @@ -28,7 +28,7 @@ public class ExampleController : ControllerBase } ``` -The text `"preview-1"` is not a valid API version status. This would not detected until runtime. +The text `"preview-1"` is not a valid API version status. This would not be detected until runtime. ## How to Fix Violations diff --git a/wiki/src/diagnostic/av0004.md b/wiki/src/diagnostic/av0004.md index ecfb8b90..9843466b 100644 --- a/wiki/src/diagnostic/av0004.md +++ b/wiki/src/diagnostic/av0004.md @@ -28,7 +28,7 @@ public class ExampleController : ControllerBase } ``` -The text `-2.0` is not a valid API version. This would not detected until runtime. +The text `-2.0` is not a valid API version. This would not be detected until runtime. ## How to Fix Violations diff --git a/wiki/src/diagnostic/av0005.md b/wiki/src/diagnostic/av0005.md index e4d587a9..6ff45103 100644 --- a/wiki/src/diagnostic/av0005.md +++ b/wiki/src/diagnostic/av0005.md @@ -27,7 +27,7 @@ public class ExampleController : ControllerBase } ``` -The year `10_000` is not a valid API version. The year must be between 1 and 9999. This would not detected until +The year `10_000` is not a valid API version. The year must be between 1 and 9999. This would not be detected until runtime. ## How to Fix Violations diff --git a/wiki/src/diagnostic/av0006.md b/wiki/src/diagnostic/av0006.md index 182dd3c8..24499d44 100644 --- a/wiki/src/diagnostic/av0006.md +++ b/wiki/src/diagnostic/av0006.md @@ -27,7 +27,7 @@ public class ExampleController : ControllerBase } ``` -The month `13` is not a valid API version. The month must be between 1 and 12. This would not detected until runtime. +The month `13` is not a valid API version. The month must be between 1 and 12. This would not be detected until runtime. ## How to Fix Violations diff --git a/wiki/src/diagnostic/av0007.md b/wiki/src/diagnostic/av0007.md index 397581f7..f1ce7449 100644 --- a/wiki/src/diagnostic/av0007.md +++ b/wiki/src/diagnostic/av0007.md @@ -27,7 +27,7 @@ public class ExampleController : ControllerBase } ``` -The day `32` is not a valid API version. The day must be between 1 and 31. This would not detected until runtime. +The day `32` is not a valid API version. The day must be between 1 and 31. This would not be detected until runtime. ## How to Fix Violations diff --git a/wiki/src/diagnostic/av0008.md b/wiki/src/diagnostic/av0008.md index e5d3f37d..57c5456b 100644 --- a/wiki/src/diagnostic/av0008.md +++ b/wiki/src/diagnostic/av0008.md @@ -27,7 +27,7 @@ public class ExampleController : ControllerBase } ``` -The date `2026-02-29` is not a valid API version because 2026 is not a leap year. This would not detected until +The date `2026-02-29` is not a valid API version because 2026 is not a leap year. This would not be detected until runtime. ## How to Fix Violations From 82c5fced013f6fc8daafc9c65d99ab2827182fcb Mon Sep 17 00:00:00 2001 From: Chris Martinez Date: Mon, 10 Aug 2026 15:01:22 -0700 Subject: [PATCH 3/6] Fix and expand support for indentation and whitespace. Related to #1205 --- .../Transformers/XmlComments.cs | 57 +++++++-- .../Simulators/Documented.cs | 28 +++++ .../Simulators/MinimalApi.cs | 28 +++++ .../Transformers/XmlCommentsStructureTest.cs | 115 +++++++++++++++++- 4 files changed, 214 insertions(+), 14 deletions(-) diff --git a/src/AspNetCore/WebApi/src/Asp.Versioning.OpenApi/Transformers/XmlComments.cs b/src/AspNetCore/WebApi/src/Asp.Versioning.OpenApi/Transformers/XmlComments.cs index c0ea3823..2996d93c 100644 --- a/src/AspNetCore/WebApi/src/Asp.Versioning.OpenApi/Transformers/XmlComments.cs +++ b/src/AspNetCore/WebApi/src/Asp.Versioning.OpenApi/Transformers/XmlComments.cs @@ -24,7 +24,12 @@ public class XmlComments /// Initializes a new instance of the class. /// /// The file path of the XML comments to read. - protected XmlComments( string path ) => Xml = File.Exists( path ) ? XDocument.Load( path ) : new(); + /// The whitespace of the source file is preserved. A reader discards a text node that is only + /// whitespace by default, which is not insignificant here: it is the indentation the file is written with, + /// and it is the only way to know the margin that has to be removed before the text reads as Markdown. It is + /// also the space between two adjacent tags, which is the space between the words they wrap. + protected XmlComments( string path ) => + Xml = File.Exists( path ) ? XDocument.Load( path, LoadOptions.PreserveWhitespace ) : new(); /// /// Creates and returns new from the specified file. @@ -374,7 +379,12 @@ private static void ResolveParamRefTags( XElement element ) // containing element is rebuilt rather than each being replaced in turn, because the whitespace // between two of them is not a reliable separator: XLinq merges the text nodes around a replaced element. // - // This runs last, so every other tag has already been resolved to text and is the only element left. + // Only a starts a paragraph. Everything between two of them belongs to the same one, including a tag + // left in the tree because it has no Markdown of its own, such as or . Reading one of those as a + // block of its own would break the sentence around it into a paragraph per fragment. + // + // This runs last, so every other tag has already been resolved to text and is the only element left + // that carries structure. private static void ResolveParaTags( XElement element ) { foreach ( var parent in element.DescendantsAndSelf().ToArray() ) @@ -385,26 +395,41 @@ private static void ResolveParaTags( XElement element ) } var blocks = new List(); + var paragraph = new StringBuilder(); foreach ( var node in parent.Nodes() ) { - var text = node switch + if ( node is XElement para && para.Name == "para" ) { - XText content => TrimEachLine( content.Value ), - XElement para => TrimEachLine( para.Value ), - _ => string.Empty, - }; - - if ( text.Length > 0 ) + AddBlock( blocks, paragraph.ToString() ); + paragraph.Clear(); + AddBlock( blocks, para.Value ); + } + else if ( node is XText content ) { - blocks.Add( text ); + paragraph.Append( content.Value ); + } + else if ( node is XElement other ) + { + paragraph.Append( other.Value ); } } + AddBlock( blocks, paragraph.ToString() ); parent.ReplaceNodes( new XText( string.Join( "\n\n", blocks ) ) ); } } + private static void AddBlock( List blocks, string text ) + { + var block = TrimEachLine( text ); + + if ( block.Length > 0 ) + { + blocks.Add( block ); + } + } + private static void ResolveListTags( XElement element ) { foreach ( var list in element.Descendants( "list" ).ToArray() ) @@ -579,6 +604,11 @@ private static void ResolveInlineCode( XElement element ) // , , and are the html tags a documentation comment carries inline, and each has a direct markdown // equivalent. rewriting them keeps the meaning that reading the text of the enclosing element would drop. // the tags are visited from the inside out so that one nested in another is rewritten before it is absorbed. + // + // emphasis is delimited by an asterisk rather than an underscore. the two are interchangeable on their own, + // but an underscore only opens or closes emphasis at a word boundary, so it is literal text in the middle of + // a word and it does not pair with the asterisk of a nested the other way around; x and + // x then render differently despite meaning the same thing. private static void ResolveInlineTags( XElement element ) { foreach ( var inline in element.Descendants().Reverse().ToArray().Where( e => e.Parent is not null ) ) @@ -586,7 +616,7 @@ private static void ResolveInlineTags( XElement element ) var text = inline.Name.LocalName switch { "b" => Delimit( inline.Value, "**" ), - "i" => Delimit( inline.Value, "_" ), + "i" => Delimit( inline.Value, "*" ), "a" => LinkOf( inline ), _ => default, }; @@ -699,7 +729,10 @@ private static int MarginOf( string text ) var lines = text.Split( '\n' ); var margin = int.MaxValue; - for ( var i = 0; i < lines.Length; i++ ) + // the text of a member begins immediately after its opening tag rather than at the start of a line, so + // whatever precedes the first break carries none of the indentation the margin is measured from. counting + // it would report a margin of zero and leave the indentation on every line that does start one. + for ( var i = 1; i < lines.Length; i++ ) { var line = lines[i]; diff --git a/src/AspNetCore/WebApi/test/Asp.Versioning.OpenApi.Tests/Simulators/Documented.cs b/src/AspNetCore/WebApi/test/Asp.Versioning.OpenApi.Tests/Simulators/Documented.cs index a34c19da..b5b52d89 100644 --- a/src/AspNetCore/WebApi/test/Asp.Versioning.OpenApi.Tests/Simulators/Documented.cs +++ b/src/AspNetCore/WebApi/test/Asp.Versioning.OpenApi.Tests/Simulators/Documented.cs @@ -116,6 +116,34 @@ public class Documented /// public string Emphasis { get; set; } + /// + /// Gets or sets the sibling, which is underlined in place. + /// A note. + /// + public string Sibling { get; set; } + + /// + /// Gets or sets the adjacent. + /// + /// Remark of GetToDo + /// + /// + /// Remark of GetToDo + /// + /// + public string Adjacent { get; set; } + + /// + /// Gets or sets the intraword. + /// + /// Verylongword + /// + /// + /// Verylongword + /// + /// + public string Intraword { get; set; } + /// /// Gets or sets the reference, which is described by the /// specification. diff --git a/src/AspNetCore/WebApi/test/Asp.Versioning.OpenApi.Tests/Simulators/MinimalApi.cs b/src/AspNetCore/WebApi/test/Asp.Versioning.OpenApi.Tests/Simulators/MinimalApi.cs index 320e5a5c..ca8d95ff 100644 --- a/src/AspNetCore/WebApi/test/Asp.Versioning.OpenApi.Tests/Simulators/MinimalApi.cs +++ b/src/AspNetCore/WebApi/test/Asp.Versioning.OpenApi.Tests/Simulators/MinimalApi.cs @@ -36,6 +36,34 @@ public static class MinimalApi /// The detailed answer. public static int Detailed() => 42; + /// Mixed + /// + /// Text before code + /// + /// + /// var index = 5; + /// index++; + /// + /// + /// Text after code + /// + /// The mixed answer. + public static int Mixed() => 42; + + /// Outlined + /// + /// Text before list + /// + /// + /// First + /// Second + /// + /// + /// Text after list + /// + /// The outlined answer. + public static int Outlined() => 42; + /// /// Echo /// diff --git a/src/AspNetCore/WebApi/test/Asp.Versioning.OpenApi.Tests/Transformers/XmlCommentsStructureTest.cs b/src/AspNetCore/WebApi/test/Asp.Versioning.OpenApi.Tests/Transformers/XmlCommentsStructureTest.cs index 6d220f50..7261cd15 100644 --- a/src/AspNetCore/WebApi/test/Asp.Versioning.OpenApi.Tests/Transformers/XmlCommentsStructureTest.cs +++ b/src/AspNetCore/WebApi/test/Asp.Versioning.OpenApi.Tests/Transformers/XmlCommentsStructureTest.cs @@ -260,7 +260,7 @@ public void bold_and_italic_should_be_resolved_into_emphasis() var summary = comments.GetSummary( property ); // assert - summary.Should().Be( "Gets or sets the highlights, which are **important** and _subtle_." ); + summary.Should().Be( "Gets or sets the highlights, which are **important** and *subtle*." ); } [Fact] @@ -274,7 +274,62 @@ public void nested_emphasis_should_be_resolved_from_the_inside_out() var summary = comments.GetSummary( property ); // assert - summary.Should().Be( "Gets or sets the emphasis, which is **very _strongly_ worded**." ); + summary.Should().Be( "Gets or sets the emphasis, which is **very *strongly* worded**." ); + } + + [Fact] + public void nested_emphasis_should_be_resolved_the_same_way_in_either_order() + { + // arrange + var comments = XmlComments.FromFile( FilePath.XmlCommentFile ); + var property = typeof( Documented ).GetProperty( nameof( Documented.Intraword ) ); + + // act + var summary = comments.GetSummary( property ); + + // assert + summary.Should().Be( + "Gets or sets the intraword.\n" + + "\n" + + "Very***long***word\n" + + "\n" + + "Very***long***word" ); + } + + [Fact] + public void tag_beside_a_paragraph_should_not_start_one() + { + // arrange + var comments = XmlComments.FromFile( FilePath.XmlCommentFile ); + var property = typeof( Documented ).GetProperty( nameof( Documented.Sibling ) ); + + // act + var summary = comments.GetSummary( property ); + + // assert + summary.Should().Be( + "Gets or sets the sibling, which is underlined in place.\n" + + "\n" + + "A note." ); + } + + [Fact] + public void space_between_adjacent_inline_tags_should_be_retained() + { + // arrange + var comments = XmlComments.FromFile( FilePath.XmlCommentFile ); + var property = typeof( Documented ).GetProperty( nameof( Documented.Adjacent ) ); + + // act + var summary = comments.GetSummary( property ); + + // assert + summary.Should().Be( + "Gets or sets the adjacent.\n" + + "\n" + + "**Remark *of*** GetToDo\n" + + "\n" + + "**Remark** *of* GetToDo" ); } [Fact] @@ -373,6 +428,61 @@ public async Task paramref_should_be_resolved_in_the_document() description.GetValue().Should().Be( "The value of `id`." ); } + [Fact] + public void text_around_a_code_block_should_not_be_indented() + { + // arrange + var comments = XmlComments.FromFile( FilePath.XmlCommentFile ); + var method = typeof( MinimalApi ).GetMethod( nameof( MinimalApi.Mixed ) ); + + // act + var remarks = comments.GetRemarks( method ); + + // assert + remarks.Should().Be( + "Text before code\n" + + "\n\n" + + "```\n" + + "var index = 5;\n" + + "index++;\n" + + "```\n" + + "\n\n" + + "Text after code" ); + } + + [Fact] + public void text_around_a_list_should_not_be_indented() + { + // arrange + var comments = XmlComments.FromFile( FilePath.XmlCommentFile ); + var method = typeof( MinimalApi ).GetMethod( nameof( MinimalApi.Outlined ) ); + + // act + var remarks = comments.GetRemarks( method ); + + // assert + remarks.Should().Be( + "Text before list\n" + + "\n" + + "* First\n" + + "* Second\n" + + "\n" + + "Text after list" ); + } + + [Fact] + public async Task text_around_a_code_block_should_not_be_indented_in_the_document() + { + // arrange + var paths = await GeneratePathsAsync(); + + // act + var description = paths["/test/mixed"]["get"]["description"].GetValue(); + + // assert + description.Should().NotContain( "\n " ).And.StartWith( "Text before code" ); + } + [Fact] public async Task summary_and_value_should_describe_a_property() { @@ -421,6 +531,7 @@ private static async Task GenerateDocumentAsync() api.MapGet( "detailed", MinimalApi.Detailed ); api.MapGet( "documented", () => new Documented() ); api.MapGet( "echo/{id:int}", MinimalApi.Echo ); + api.MapGet( "mixed", MinimalApi.Mixed ); app.MapOpenApi().WithDocumentPerVersion(); var cancellationToken = TestContext.Current.CancellationToken; From 8ed27c6762cf9888f54d63c2d3e95317b1ad9261 Mon Sep 17 00:00:00 2001 From: Chris Martinez Date: Mon, 10 Aug 2026 20:33:32 -0700 Subject: [PATCH 4/6] Integration OpenGraph (OG) meta tags into pages with build validation to ensure no required descriptions are empty --- .github/workflows/gh-pages.yml | 7 + wiki/src/README.md | 2 + wiki/src/aspnet-core/config/conventions.md | 2 + wiki/src/aspnet-core/config/options.md | 2 + wiki/src/aspnet-core/config/overview.md | 2 + wiki/src/aspnet-core/config/reader.md | 2 + wiki/src/aspnet-core/config/selector.md | 2 + wiki/src/aspnet-core/docs/grpc-options.md | 2 + wiki/src/aspnet-core/docs/odata-options.md | 2 + wiki/src/aspnet-core/docs/openapi-options.md | 2 + wiki/src/aspnet-core/docs/options.md | 2 + wiki/src/aspnet-core/docs/overview.md | 2 + wiki/src/aspnet-core/docs/scalar.md | 2 + wiki/src/aspnet-core/docs/swashbuckle.md | 2 + wiki/src/aspnet-core/errors.md | 2 + wiki/src/aspnet-core/examples.md | 2 + wiki/src/aspnet-core/ext/clients.md | 2 + wiki/src/aspnet-core/ext/custom-attributes.md | 2 + wiki/src/aspnet-core/ext/custom-format.md | 2 + wiki/src/aspnet-core/ext/third-party.md | 2 + wiki/src/aspnet-core/faq.md | 2 + wiki/src/aspnet-core/grpc/overview.md | 2 + .../aspnet-core/grpc/request-parameters.md | 2 + wiki/src/aspnet-core/grpc/versioned-fields.md | 2 + .../how-to/define-service-version.md | 2 + .../aspnet-core/how-to/deprecate-version.md | 2 + .../aspnet-core/how-to/existing-services.md | 2 + .../aspnet-core/how-to/naming-conventions.md | 2 + wiki/src/aspnet-core/how-to/overview.md | 2 + .../aspnet-core/how-to/requested-version.md | 2 + .../how-to/version-advertisement.md | 2 + .../aspnet-core/how-to/version-by-header.md | 2 + .../how-to/version-by-media-type.md | 2 + .../how-to/version-by-query-string.md | 2 + wiki/src/aspnet-core/how-to/version-by-url.md | 2 + .../how-to/version-interleaving.md | 2 + .../src/aspnet-core/how-to/version-neutral.md | 2 + .../aspnet-core/how-to/versioned-models.md | 2 + wiki/src/aspnet-core/limitations.md | 2 + wiki/src/aspnet-core/odata/batching.md | 2 + wiki/src/aspnet-core/odata/controllers.md | 2 + wiki/src/aspnet-core/odata/metadata.md | 2 + wiki/src/aspnet-core/odata/model-builder.md | 2 + wiki/src/aspnet-core/odata/model-config.md | 2 + .../aspnet-core/odata/model-substitution.md | 2 + wiki/src/aspnet-core/odata/overview.md | 2 + .../quick-starts/existing-services.md | 2 + .../src/aspnet-core/quick-starts/migration.md | 2 + .../aspnet-core/quick-starts/new-services.md | 2 + wiki/src/aspnet-core/version-discovery.md | 2 + wiki/src/aspnet-core/version-format.md | 2 + wiki/src/aspnet-core/version-policies.md | 2 + wiki/src/aspnet/config/conventions.md | 2 + wiki/src/aspnet/config/options.md | 2 + wiki/src/aspnet/config/overview.md | 2 + wiki/src/aspnet/config/reader.md | 2 + wiki/src/aspnet/config/selector.md | 2 + wiki/src/aspnet/docs/odata-options.md | 2 + wiki/src/aspnet/docs/options.md | 2 + wiki/src/aspnet/docs/overview.md | 2 + wiki/src/aspnet/docs/swashbuckle.md | 2 + wiki/src/aspnet/errors.md | 2 + wiki/src/aspnet/examples.md | 2 + wiki/src/aspnet/ext/clients.md | 2 + wiki/src/aspnet/ext/custom-attributes.md | 2 + wiki/src/aspnet/ext/custom-format.md | 2 + wiki/src/aspnet/faq.md | 2 + .../aspnet/how-to/define-service-version.md | 2 + wiki/src/aspnet/how-to/deprecate-version.md | 2 + wiki/src/aspnet/how-to/existing-services.md | 2 + wiki/src/aspnet/how-to/naming-conventions.md | 2 + wiki/src/aspnet/how-to/overview.md | 2 + wiki/src/aspnet/how-to/requested-version.md | 2 + .../aspnet/how-to/version-advertisement.md | 2 + wiki/src/aspnet/how-to/version-by-header.md | 2 + .../aspnet/how-to/version-by-media-type.md | 2 + .../aspnet/how-to/version-by-query-string.md | 2 + wiki/src/aspnet/how-to/version-by-url.md | 2 + .../src/aspnet/how-to/version-interleaving.md | 2 + wiki/src/aspnet/how-to/version-neutral.md | 2 + wiki/src/aspnet/limitations.md | 2 + wiki/src/aspnet/odata/controllers.md | 2 + wiki/src/aspnet/odata/metadata.md | 2 + wiki/src/aspnet/odata/model-builder.md | 2 + wiki/src/aspnet/odata/model-config.md | 2 + wiki/src/aspnet/odata/model-substitution.md | 2 + wiki/src/aspnet/odata/overview.md | 2 + wiki/src/aspnet/odata/protocol-transition.md | 2 + .../aspnet/quick-starts/existing-services.md | 2 + wiki/src/aspnet/quick-starts/migration.md | 2 + wiki/src/aspnet/quick-starts/new-services.md | 2 + wiki/src/aspnet/version-discovery.md | 2 + wiki/src/aspnet/version-format.md | 4 +- wiki/src/aspnet/version-policies.md | 2 + wiki/src/diagnostic/av0001.md | 2 + wiki/src/diagnostic/av0002.md | 2 + wiki/src/diagnostic/av0003.md | 2 + wiki/src/diagnostic/av0004.md | 2 + wiki/src/diagnostic/av0005.md | 2 + wiki/src/diagnostic/av0006.md | 2 + wiki/src/diagnostic/av0007.md | 2 + wiki/src/diagnostic/av0008.md | 2 + wiki/src/diagnostic/av0009.md | 2 + wiki/src/diagnostic/av0010.md | 2 + wiki/src/diagnostic/av0011.md | 2 + wiki/src/diagnostic/av0012.md | 2 + wiki/src/diagnostic/av0013.md | 2 + wiki/src/diagnostic/av0014.md | 2 + wiki/src/diagnostic/av0015.md | 2 + wiki/src/diagnostic/av0016.md | 2 + wiki/src/diagnostic/av0017.md | 2 + wiki/src/diagnostic/av0018.md | 2 + wiki/src/diagnostic/av0019.md | 2 + wiki/src/diagnostic/av0020.md | 2 + wiki/src/diagnostic/av0021.md | 2 + wiki/src/diagnostic/av0022.md | 2 + wiki/src/diagnostic/av0023.md | 2 + wiki/src/diagnostic/av0024.md | 2 + wiki/src/diagnostic/av0025.md | 2 + wiki/src/diagnostic/av0026.md | 2 + wiki/src/diagnostic/av0027.md | 2 + wiki/src/diagnostic/av0028.md | 2 + wiki/src/diagnostic/av0029.md | 2 + wiki/src/diagnostic/av0030.md | 2 + wiki/src/diagnostic/av0031.md | 2 + wiki/src/diagnostic/overview.md | 2 + wiki/src/getting-started.md | 2 + wiki/src/og-image.png | Bin 0 -> 106257 bytes wiki/theme/head.hbs | 32 ++++ wiki/tools/Add-PageMetadata.ps1 | 141 ++++++++++++++++++ 130 files changed, 433 insertions(+), 1 deletion(-) create mode 100644 wiki/src/og-image.png create mode 100644 wiki/theme/head.hbs create mode 100644 wiki/tools/Add-PageMetadata.ps1 diff --git a/.github/workflows/gh-pages.yml b/.github/workflows/gh-pages.yml index 09cea5fb..9f20258e 100644 --- a/.github/workflows/gh-pages.yml +++ b/.github/workflows/gh-pages.yml @@ -35,6 +35,13 @@ jobs: cd wiki mdbook build + # mdBook has no per-page description and cannot build a page URL in its template, + # so descriptions declared as comments are lifted into + # here, along with og:url and canonical. + - name: Add Page Metadata + shell: pwsh + run: ./wiki/tools/Add-PageMetadata.ps1 -Book ./wiki/book -Require + # mdBook rewrites .md links to .html without verifying the target exists, so a # renamed or removed page builds cleanly and 404s in production. This also checks # that the legacy wiki redirect map still resolves. diff --git a/wiki/src/README.md b/wiki/src/README.md index 3c0450e4..908c0803 100644 --- a/wiki/src/README.md +++ b/wiki/src/README.md @@ -1,3 +1,5 @@ + + # Introduction Versioning is an important aspect of any mature web service. Microsoft has published REST API guidelines that require diff --git a/wiki/src/aspnet-core/config/conventions.md b/wiki/src/aspnet-core/config/conventions.md index c1e321f8..01630139 100644 --- a/wiki/src/aspnet-core/config/conventions.md +++ b/wiki/src/aspnet-core/config/conventions.md @@ -1,3 +1,5 @@ + + {{#include ../../shared/config/conventions-pre.md}} ```c# diff --git a/wiki/src/aspnet-core/config/options.md b/wiki/src/aspnet-core/config/options.md index 7dacf469..65651263 100644 --- a/wiki/src/aspnet-core/config/options.md +++ b/wiki/src/aspnet-core/config/options.md @@ -1 +1,3 @@ + + {{#include ../../shared/config/options.md}} \ No newline at end of file diff --git a/wiki/src/aspnet-core/config/overview.md b/wiki/src/aspnet-core/config/overview.md index dc0dd248..39f3e901 100644 --- a/wiki/src/aspnet-core/config/overview.md +++ b/wiki/src/aspnet-core/config/overview.md @@ -1,3 +1,5 @@ + + # Configuring Your Application Although different variations of ASP.NET have distinct application initialization methods, careful consideration was diff --git a/wiki/src/aspnet-core/config/reader.md b/wiki/src/aspnet-core/config/reader.md index 38d23c8e..9390a20c 100644 --- a/wiki/src/aspnet-core/config/reader.md +++ b/wiki/src/aspnet-core/config/reader.md @@ -1 +1,3 @@ + + {{#include ../../shared/config/reader.md}} \ No newline at end of file diff --git a/wiki/src/aspnet-core/config/selector.md b/wiki/src/aspnet-core/config/selector.md index cfc5e1f2..f4b8c104 100644 --- a/wiki/src/aspnet-core/config/selector.md +++ b/wiki/src/aspnet-core/config/selector.md @@ -1 +1,3 @@ + + {{#include ../../shared/config/selector.md}} \ No newline at end of file diff --git a/wiki/src/aspnet-core/docs/grpc-options.md b/wiki/src/aspnet-core/docs/grpc-options.md index 9458a63f..b210b2cd 100644 --- a/wiki/src/aspnet-core/docs/grpc-options.md +++ b/wiki/src/aspnet-core/docs/grpc-options.md @@ -1,3 +1,5 @@ + + # gRPC Options The API Explorer support for gRPC has a few options that allow you to customize the behavior. The options are minimal diff --git a/wiki/src/aspnet-core/docs/odata-options.md b/wiki/src/aspnet-core/docs/odata-options.md index ac65380b..8874ebbd 100644 --- a/wiki/src/aspnet-core/docs/odata-options.md +++ b/wiki/src/aspnet-core/docs/odata-options.md @@ -1,3 +1,5 @@ + + {{#include ../../shared/docs/odata-options-pre.md}} {{#include ../../shared/docs/odata-options-post.md}} diff --git a/wiki/src/aspnet-core/docs/openapi-options.md b/wiki/src/aspnet-core/docs/openapi-options.md index 3e31cf51..f96c9672 100644 --- a/wiki/src/aspnet-core/docs/openapi-options.md +++ b/wiki/src/aspnet-core/docs/openapi-options.md @@ -1,3 +1,5 @@ + + # OpenAPI Options The OpenAPI options allows you to configure, customize, and extend the default behaviors when you add OpenAPI support. diff --git a/wiki/src/aspnet-core/docs/options.md b/wiki/src/aspnet-core/docs/options.md index f3e4b106..51613358 100644 --- a/wiki/src/aspnet-core/docs/options.md +++ b/wiki/src/aspnet-core/docs/options.md @@ -1,3 +1,5 @@ + + {{#include ../../shared/docs/options-pre.md}} - [FormatGroupName](#format-group-name) diff --git a/wiki/src/aspnet-core/docs/overview.md b/wiki/src/aspnet-core/docs/overview.md index 745ff719..9dc112d8 100644 --- a/wiki/src/aspnet-core/docs/overview.md +++ b/wiki/src/aspnet-core/docs/overview.md @@ -1,3 +1,5 @@ + + {{#include ../../shared/docs/overview-pre.md}} Any OpenAPI generator such as [Microsoft][openapi-ms], [Swashbuckle][openapi-swashbuckle], or [NSwag][openapi-nswag] diff --git a/wiki/src/aspnet-core/docs/scalar.md b/wiki/src/aspnet-core/docs/scalar.md index 5d2e3400..eb382f13 100644 --- a/wiki/src/aspnet-core/docs/scalar.md +++ b/wiki/src/aspnet-core/docs/scalar.md @@ -1,3 +1,5 @@ + + # Scalar Integration [Scalar](https://scalar.com/) has quickly become one of the more common, modern OpenAPI user interfaces and it easily diff --git a/wiki/src/aspnet-core/docs/swashbuckle.md b/wiki/src/aspnet-core/docs/swashbuckle.md index 71d4c537..cd2db5ee 100644 --- a/wiki/src/aspnet-core/docs/swashbuckle.md +++ b/wiki/src/aspnet-core/docs/swashbuckle.md @@ -1,3 +1,5 @@ + + {{#include ../../shared/docs/swashbuckle-pre.md}} Remember to add the necessary references to one or both of the following: diff --git a/wiki/src/aspnet-core/errors.md b/wiki/src/aspnet-core/errors.md index 4efc78c6..68125247 100644 --- a/wiki/src/aspnet-core/errors.md +++ b/wiki/src/aspnet-core/errors.md @@ -1,3 +1,5 @@ + + {{#include ../shared/errors-pre.md}} ## Customization diff --git a/wiki/src/aspnet-core/examples.md b/wiki/src/aspnet-core/examples.md index c0ae40af..5d610268 100644 --- a/wiki/src/aspnet-core/examples.md +++ b/wiki/src/aspnet-core/examples.md @@ -1,3 +1,5 @@ + + # Examples Complete, runnable sample projects live in the [examples] folder of the repository. diff --git a/wiki/src/aspnet-core/ext/clients.md b/wiki/src/aspnet-core/ext/clients.md index 5960a704..68a111bc 100644 --- a/wiki/src/aspnet-core/ext/clients.md +++ b/wiki/src/aspnet-core/ext/clients.md @@ -1 +1,3 @@ + + {{#include ../../shared/ext/clients.md}} \ No newline at end of file diff --git a/wiki/src/aspnet-core/ext/custom-attributes.md b/wiki/src/aspnet-core/ext/custom-attributes.md index c30a705a..ef39738b 100644 --- a/wiki/src/aspnet-core/ext/custom-attributes.md +++ b/wiki/src/aspnet-core/ext/custom-attributes.md @@ -1,3 +1,5 @@ + + {{#include ../../shared/ext/custom-attributes-pre.md}} ``` diff --git a/wiki/src/aspnet-core/ext/custom-format.md b/wiki/src/aspnet-core/ext/custom-format.md index fee96ef7..4ab93ead 100644 --- a/wiki/src/aspnet-core/ext/custom-format.md +++ b/wiki/src/aspnet-core/ext/custom-format.md @@ -1 +1,3 @@ + + {{#include ../../shared/ext/custom-format.md}} \ No newline at end of file diff --git a/wiki/src/aspnet-core/ext/third-party.md b/wiki/src/aspnet-core/ext/third-party.md index 04992b1c..fa03855f 100644 --- a/wiki/src/aspnet-core/ext/third-party.md +++ b/wiki/src/aspnet-core/ext/third-party.md @@ -1,3 +1,5 @@ + + # Third-Party The following are external, third-party extensions that showcase extensibility. diff --git a/wiki/src/aspnet-core/faq.md b/wiki/src/aspnet-core/faq.md index e008042c..ccfbb054 100644 --- a/wiki/src/aspnet-core/faq.md +++ b/wiki/src/aspnet-core/faq.md @@ -1 +1,3 @@ + + {{#include ../shared/faq.md}} \ No newline at end of file diff --git a/wiki/src/aspnet-core/grpc/overview.md b/wiki/src/aspnet-core/grpc/overview.md index e04b9dff..90d8cafe 100644 --- a/wiki/src/aspnet-core/grpc/overview.md +++ b/wiki/src/aspnet-core/grpc/overview.md @@ -1,3 +1,5 @@ + + # API Versioning with gRPC Service API versioning using gRPC is nearly identical to the standard configuration with only a few modifications. When diff --git a/wiki/src/aspnet-core/grpc/request-parameters.md b/wiki/src/aspnet-core/grpc/request-parameters.md index 0b59b43f..2550cd70 100644 --- a/wiki/src/aspnet-core/grpc/request-parameters.md +++ b/wiki/src/aspnet-core/grpc/request-parameters.md @@ -1,3 +1,5 @@ + + # Request Parameters In most cases, adding API versioning to your gRPC services is orthogonal to how you define your service. gRPC sits atop diff --git a/wiki/src/aspnet-core/grpc/versioned-fields.md b/wiki/src/aspnet-core/grpc/versioned-fields.md index 52ce6fb6..1433b7fa 100644 --- a/wiki/src/aspnet-core/grpc/versioned-fields.md +++ b/wiki/src/aspnet-core/grpc/versioned-fields.md @@ -1,3 +1,5 @@ + + # Versioned Message Fields Protocol Buffer messages are designed to support backward compatibility. JSON schemas, on the other hand, can be strict diff --git a/wiki/src/aspnet-core/how-to/define-service-version.md b/wiki/src/aspnet-core/how-to/define-service-version.md index f0479fff..fe797d4d 100644 --- a/wiki/src/aspnet-core/how-to/define-service-version.md +++ b/wiki/src/aspnet-core/how-to/define-service-version.md @@ -1 +1,3 @@ + + {{#include ../../shared/how-to/define-service-version.md}} \ No newline at end of file diff --git a/wiki/src/aspnet-core/how-to/deprecate-version.md b/wiki/src/aspnet-core/how-to/deprecate-version.md index af3cede0..6b96b3d8 100644 --- a/wiki/src/aspnet-core/how-to/deprecate-version.md +++ b/wiki/src/aspnet-core/how-to/deprecate-version.md @@ -1,3 +1,5 @@ + + {{#include ../../shared/how-to/deprecate-version-pre.md}} This example demonstrates API versioning using all non-URL segment methods. diff --git a/wiki/src/aspnet-core/how-to/existing-services.md b/wiki/src/aspnet-core/how-to/existing-services.md index 5246d8fa..c933da53 100644 --- a/wiki/src/aspnet-core/how-to/existing-services.md +++ b/wiki/src/aspnet-core/how-to/existing-services.md @@ -1,3 +1,5 @@ + + {{#include ../../shared/how-to/existing-services-pre.md}} ```c# diff --git a/wiki/src/aspnet-core/how-to/naming-conventions.md b/wiki/src/aspnet-core/how-to/naming-conventions.md index 8530f2dd..8ef24902 100644 --- a/wiki/src/aspnet-core/how-to/naming-conventions.md +++ b/wiki/src/aspnet-core/how-to/naming-conventions.md @@ -1,3 +1,5 @@ + + {{#include ../../shared/how-to/naming-conventions-pre.md}} ```c# diff --git a/wiki/src/aspnet-core/how-to/overview.md b/wiki/src/aspnet-core/how-to/overview.md index 20e7c990..f5ed1d6d 100644 --- a/wiki/src/aspnet-core/how-to/overview.md +++ b/wiki/src/aspnet-core/how-to/overview.md @@ -1,3 +1,5 @@ + + {{#include ../../shared/how-to/overview-pre.md}} ### Minimal API diff --git a/wiki/src/aspnet-core/how-to/requested-version.md b/wiki/src/aspnet-core/how-to/requested-version.md index d8828930..18f1f3ee 100644 --- a/wiki/src/aspnet-core/how-to/requested-version.md +++ b/wiki/src/aspnet-core/how-to/requested-version.md @@ -1,3 +1,5 @@ + + {{#include ../../shared/how-to/requested-version-pre.md}} ### Minimal API diff --git a/wiki/src/aspnet-core/how-to/version-advertisement.md b/wiki/src/aspnet-core/how-to/version-advertisement.md index fad4f60f..cb98b22e 100644 --- a/wiki/src/aspnet-core/how-to/version-advertisement.md +++ b/wiki/src/aspnet-core/how-to/version-advertisement.md @@ -1,3 +1,5 @@ + + {{#include ../../shared/how-to/version-advertisement-pre.md}} ```c# diff --git a/wiki/src/aspnet-core/how-to/version-by-header.md b/wiki/src/aspnet-core/how-to/version-by-header.md index bb127080..acdff918 100644 --- a/wiki/src/aspnet-core/how-to/version-by-header.md +++ b/wiki/src/aspnet-core/how-to/version-by-header.md @@ -1,3 +1,5 @@ + + {{#include ../../shared/how-to/version-by-header-pre.md}} ### Minimal API diff --git a/wiki/src/aspnet-core/how-to/version-by-media-type.md b/wiki/src/aspnet-core/how-to/version-by-media-type.md index 542c00e3..5178cb32 100644 --- a/wiki/src/aspnet-core/how-to/version-by-media-type.md +++ b/wiki/src/aspnet-core/how-to/version-by-media-type.md @@ -1,3 +1,5 @@ + + {{#include ../../shared/how-to/version-by-media-type-pre.md}} ### Minimal API diff --git a/wiki/src/aspnet-core/how-to/version-by-query-string.md b/wiki/src/aspnet-core/how-to/version-by-query-string.md index 5a964914..88f2aeb1 100644 --- a/wiki/src/aspnet-core/how-to/version-by-query-string.md +++ b/wiki/src/aspnet-core/how-to/version-by-query-string.md @@ -1,3 +1,5 @@ + + {{#include ../../shared/how-to/version-by-query-string-pre.md}} ### Minimal API diff --git a/wiki/src/aspnet-core/how-to/version-by-url.md b/wiki/src/aspnet-core/how-to/version-by-url.md index 19a26d90..69aada90 100644 --- a/wiki/src/aspnet-core/how-to/version-by-url.md +++ b/wiki/src/aspnet-core/how-to/version-by-url.md @@ -1,3 +1,5 @@ + + {{#include ../../shared/how-to/version-by-url-pre.md}} ### Minimal API diff --git a/wiki/src/aspnet-core/how-to/version-interleaving.md b/wiki/src/aspnet-core/how-to/version-interleaving.md index 479d6c12..20bf0ae5 100644 --- a/wiki/src/aspnet-core/how-to/version-interleaving.md +++ b/wiki/src/aspnet-core/how-to/version-interleaving.md @@ -1,3 +1,5 @@ + + {{#include ../../shared/how-to/version-interleaving-pre.md}} ### Minimal API diff --git a/wiki/src/aspnet-core/how-to/version-neutral.md b/wiki/src/aspnet-core/how-to/version-neutral.md index 44c13595..962b1efb 100644 --- a/wiki/src/aspnet-core/how-to/version-neutral.md +++ b/wiki/src/aspnet-core/how-to/version-neutral.md @@ -1,3 +1,5 @@ + + {{#include ../../shared/how-to/version-neutral-pre.md}} ### Minimal API diff --git a/wiki/src/aspnet-core/how-to/versioned-models.md b/wiki/src/aspnet-core/how-to/versioned-models.md index 2789ec3c..28c89255 100644 --- a/wiki/src/aspnet-core/how-to/versioned-models.md +++ b/wiki/src/aspnet-core/how-to/versioned-models.md @@ -1,3 +1,5 @@ + + # Versioned Models When an API is versioned, it is often necessary to version the models that are used in the API. This is especially true diff --git a/wiki/src/aspnet-core/limitations.md b/wiki/src/aspnet-core/limitations.md index 26c2911a..5df13bf9 100644 --- a/wiki/src/aspnet-core/limitations.md +++ b/wiki/src/aspnet-core/limitations.md @@ -1,3 +1,5 @@ + + # Known Limitations ## URL Path Segment diff --git a/wiki/src/aspnet-core/odata/batching.md b/wiki/src/aspnet-core/odata/batching.md index 35ad7fe9..32a51288 100644 --- a/wiki/src/aspnet-core/odata/batching.md +++ b/wiki/src/aspnet-core/odata/batching.md @@ -1,3 +1,5 @@ + + # Batching OData batch operations are meant to execute the same way that other requests do; however, there may be some minor, but diff --git a/wiki/src/aspnet-core/odata/controllers.md b/wiki/src/aspnet-core/odata/controllers.md index 7ecd626e..b4d8ade8 100644 --- a/wiki/src/aspnet-core/odata/controllers.md +++ b/wiki/src/aspnet-core/odata/controllers.md @@ -1 +1,3 @@ + + {{#include ../../shared/odata/controllers.md}} \ No newline at end of file diff --git a/wiki/src/aspnet-core/odata/metadata.md b/wiki/src/aspnet-core/odata/metadata.md index e5662e48..a2a23cbc 100644 --- a/wiki/src/aspnet-core/odata/metadata.md +++ b/wiki/src/aspnet-core/odata/metadata.md @@ -1 +1,3 @@ + + {{#include ../../shared/odata/metadata.md}} \ No newline at end of file diff --git a/wiki/src/aspnet-core/odata/model-builder.md b/wiki/src/aspnet-core/odata/model-builder.md index 819f21fd..ffa243f0 100644 --- a/wiki/src/aspnet-core/odata/model-builder.md +++ b/wiki/src/aspnet-core/odata/model-builder.md @@ -1,3 +1,5 @@ + + {{#include ../../shared/odata/model-builder-pre.md}} >[!NOTE] diff --git a/wiki/src/aspnet-core/odata/model-config.md b/wiki/src/aspnet-core/odata/model-config.md index 0bc265ff..f7bc089a 100644 --- a/wiki/src/aspnet-core/odata/model-config.md +++ b/wiki/src/aspnet-core/odata/model-config.md @@ -1,3 +1,5 @@ + + {{#include ../../shared/odata/model-config.md}} ## Dependency Injection diff --git a/wiki/src/aspnet-core/odata/model-substitution.md b/wiki/src/aspnet-core/odata/model-substitution.md index b98dc00c..7efc6894 100644 --- a/wiki/src/aspnet-core/odata/model-substitution.md +++ b/wiki/src/aspnet-core/odata/model-substitution.md @@ -1 +1,3 @@ + + {{#include ../../shared/odata/model-substitution.md}} \ No newline at end of file diff --git a/wiki/src/aspnet-core/odata/overview.md b/wiki/src/aspnet-core/odata/overview.md index 05b8d4e4..aaf74cd2 100644 --- a/wiki/src/aspnet-core/odata/overview.md +++ b/wiki/src/aspnet-core/odata/overview.md @@ -1,3 +1,5 @@ + + {{#include ../../shared/odata/overview-pre.md}} ```c# diff --git a/wiki/src/aspnet-core/quick-starts/existing-services.md b/wiki/src/aspnet-core/quick-starts/existing-services.md index f93bb745..fdb5153d 100644 --- a/wiki/src/aspnet-core/quick-starts/existing-services.md +++ b/wiki/src/aspnet-core/quick-starts/existing-services.md @@ -1,3 +1,5 @@ + + {{#include ../../shared/quick-starts/existing-services.md}} ### Minimal API diff --git a/wiki/src/aspnet-core/quick-starts/migration.md b/wiki/src/aspnet-core/quick-starts/migration.md index e6d8d7ae..aaa68b25 100644 --- a/wiki/src/aspnet-core/quick-starts/migration.md +++ b/wiki/src/aspnet-core/quick-starts/migration.md @@ -1,3 +1,5 @@ + + {{#include ../../shared/quick-starts/migration-overview.md}} ## Package Identifiers diff --git a/wiki/src/aspnet-core/quick-starts/new-services.md b/wiki/src/aspnet-core/quick-starts/new-services.md index 6867a609..3633d9c5 100644 --- a/wiki/src/aspnet-core/quick-starts/new-services.md +++ b/wiki/src/aspnet-core/quick-starts/new-services.md @@ -1,3 +1,5 @@ + + {{#include ../../shared/quick-starts/new-services.md}} ### Minimal API diff --git a/wiki/src/aspnet-core/version-discovery.md b/wiki/src/aspnet-core/version-discovery.md index 6dd544ff..2ecc20ec 100644 --- a/wiki/src/aspnet-core/version-discovery.md +++ b/wiki/src/aspnet-core/version-discovery.md @@ -1,3 +1,5 @@ + + {{#include ../shared/version-discovery.md}} diff --git a/wiki/src/aspnet-core/version-format.md b/wiki/src/aspnet-core/version-format.md index 31deaa1c..d99a7fbb 100644 --- a/wiki/src/aspnet-core/version-format.md +++ b/wiki/src/aspnet-core/version-format.md @@ -1 +1,3 @@ + + {{#include ../shared/version-format.md}} \ No newline at end of file diff --git a/wiki/src/aspnet-core/version-policies.md b/wiki/src/aspnet-core/version-policies.md index 109af93a..3c9deb03 100644 --- a/wiki/src/aspnet-core/version-policies.md +++ b/wiki/src/aspnet-core/version-policies.md @@ -1,3 +1,5 @@ + + {{#include ../shared/version-policies.md}} diff --git a/wiki/src/aspnet/config/conventions.md b/wiki/src/aspnet/config/conventions.md index 447e46eb..5cb7edde 100644 --- a/wiki/src/aspnet/config/conventions.md +++ b/wiki/src/aspnet/config/conventions.md @@ -1,3 +1,5 @@ + + {{#include ../../shared/config/conventions-pre.md}} ```c# diff --git a/wiki/src/aspnet/config/options.md b/wiki/src/aspnet/config/options.md index 7dacf469..6277a0de 100644 --- a/wiki/src/aspnet/config/options.md +++ b/wiki/src/aspnet/config/options.md @@ -1 +1,3 @@ + + {{#include ../../shared/config/options.md}} \ No newline at end of file diff --git a/wiki/src/aspnet/config/overview.md b/wiki/src/aspnet/config/overview.md index bb58eb85..347731ee 100644 --- a/wiki/src/aspnet/config/overview.md +++ b/wiki/src/aspnet/config/overview.md @@ -1,3 +1,5 @@ + + # Configuring Your Application Although different variations of ASP.NET have distinct application initialization methods, careful consideration was diff --git a/wiki/src/aspnet/config/reader.md b/wiki/src/aspnet/config/reader.md index 38d23c8e..69a64ff0 100644 --- a/wiki/src/aspnet/config/reader.md +++ b/wiki/src/aspnet/config/reader.md @@ -1 +1,3 @@ + + {{#include ../../shared/config/reader.md}} \ No newline at end of file diff --git a/wiki/src/aspnet/config/selector.md b/wiki/src/aspnet/config/selector.md index cfc5e1f2..0f3a9aa8 100644 --- a/wiki/src/aspnet/config/selector.md +++ b/wiki/src/aspnet/config/selector.md @@ -1 +1,3 @@ + + {{#include ../../shared/config/selector.md}} \ No newline at end of file diff --git a/wiki/src/aspnet/docs/odata-options.md b/wiki/src/aspnet/docs/odata-options.md index d31600ee..a0fa9f11 100644 --- a/wiki/src/aspnet/docs/odata-options.md +++ b/wiki/src/aspnet/docs/odata-options.md @@ -1,3 +1,5 @@ + + {{#include ../../shared/docs/odata-options-pre.md}} - [UseApiExplorerSettings](#use-api-explorer-settings)1 diff --git a/wiki/src/aspnet/docs/options.md b/wiki/src/aspnet/docs/options.md index 67d7b7b0..7360b461 100644 --- a/wiki/src/aspnet/docs/options.md +++ b/wiki/src/aspnet/docs/options.md @@ -1,3 +1,5 @@ + + {{#include ../../shared/docs/options-pre.md}} {{#include ../../shared/docs/odata-options-post.md}} \ No newline at end of file diff --git a/wiki/src/aspnet/docs/overview.md b/wiki/src/aspnet/docs/overview.md index 71babd13..b3b6f8ca 100644 --- a/wiki/src/aspnet/docs/overview.md +++ b/wiki/src/aspnet/docs/overview.md @@ -1,3 +1,5 @@ + + {{#include ../../shared/docs/overview-pre.md}} Any OpenAPI generator such as [Swashbuckle][openapi-swashbuckle], or [NSwag][openapi-nswag] that leverage the API diff --git a/wiki/src/aspnet/docs/swashbuckle.md b/wiki/src/aspnet/docs/swashbuckle.md index 8da22e5b..79d58b5d 100644 --- a/wiki/src/aspnet/docs/swashbuckle.md +++ b/wiki/src/aspnet/docs/swashbuckle.md @@ -1,3 +1,5 @@ + + {{#include ../../shared/docs/swashbuckle-pre.md}} Remember to add the necessary references to one or both of the following: diff --git a/wiki/src/aspnet/errors.md b/wiki/src/aspnet/errors.md index 31f83126..de5314d7 100644 --- a/wiki/src/aspnet/errors.md +++ b/wiki/src/aspnet/errors.md @@ -1,3 +1,5 @@ + + {{#include ../shared/errors-pre.md}} ## Customization diff --git a/wiki/src/aspnet/examples.md b/wiki/src/aspnet/examples.md index 54c1e6d9..1033b603 100644 --- a/wiki/src/aspnet/examples.md +++ b/wiki/src/aspnet/examples.md @@ -1,3 +1,5 @@ + + # Examples Complete, runnable sample projects live in the [examples] folder of the repository. diff --git a/wiki/src/aspnet/ext/clients.md b/wiki/src/aspnet/ext/clients.md index 5960a704..2cc3db3b 100644 --- a/wiki/src/aspnet/ext/clients.md +++ b/wiki/src/aspnet/ext/clients.md @@ -1 +1,3 @@ + + {{#include ../../shared/ext/clients.md}} \ No newline at end of file diff --git a/wiki/src/aspnet/ext/custom-attributes.md b/wiki/src/aspnet/ext/custom-attributes.md index 167d3492..74b92b42 100644 --- a/wiki/src/aspnet/ext/custom-attributes.md +++ b/wiki/src/aspnet/ext/custom-attributes.md @@ -1,3 +1,5 @@ + + {{#include ../../shared/ext/custom-attributes-pre.md}} ``` diff --git a/wiki/src/aspnet/ext/custom-format.md b/wiki/src/aspnet/ext/custom-format.md index fee96ef7..86942eab 100644 --- a/wiki/src/aspnet/ext/custom-format.md +++ b/wiki/src/aspnet/ext/custom-format.md @@ -1 +1,3 @@ + + {{#include ../../shared/ext/custom-format.md}} \ No newline at end of file diff --git a/wiki/src/aspnet/faq.md b/wiki/src/aspnet/faq.md index e008042c..e696b8db 100644 --- a/wiki/src/aspnet/faq.md +++ b/wiki/src/aspnet/faq.md @@ -1 +1,3 @@ + + {{#include ../shared/faq.md}} \ No newline at end of file diff --git a/wiki/src/aspnet/how-to/define-service-version.md b/wiki/src/aspnet/how-to/define-service-version.md index 238be393..745b5533 100644 --- a/wiki/src/aspnet/how-to/define-service-version.md +++ b/wiki/src/aspnet/how-to/define-service-version.md @@ -1,2 +1,4 @@ + + {{#include ../../shared/how-to/define-service-version.md}} \ No newline at end of file diff --git a/wiki/src/aspnet/how-to/deprecate-version.md b/wiki/src/aspnet/how-to/deprecate-version.md index 883f7624..acee9aaf 100644 --- a/wiki/src/aspnet/how-to/deprecate-version.md +++ b/wiki/src/aspnet/how-to/deprecate-version.md @@ -1,3 +1,5 @@ + + {{#include ../../shared/how-to/deprecate-version-pre.md}} This example demonstrates API versioning using all non-URL segment methods. diff --git a/wiki/src/aspnet/how-to/existing-services.md b/wiki/src/aspnet/how-to/existing-services.md index 3fc69275..03c44331 100644 --- a/wiki/src/aspnet/how-to/existing-services.md +++ b/wiki/src/aspnet/how-to/existing-services.md @@ -1,3 +1,5 @@ + + {{#include ../../shared/how-to/existing-services-pre.md}} ```c# diff --git a/wiki/src/aspnet/how-to/naming-conventions.md b/wiki/src/aspnet/how-to/naming-conventions.md index 9236b4cb..cde9b47a 100644 --- a/wiki/src/aspnet/how-to/naming-conventions.md +++ b/wiki/src/aspnet/how-to/naming-conventions.md @@ -1,3 +1,5 @@ + + {{#include ../../shared/how-to/naming-conventions-pre.md}} ```c# diff --git a/wiki/src/aspnet/how-to/overview.md b/wiki/src/aspnet/how-to/overview.md index e1febded..9669c07d 100644 --- a/wiki/src/aspnet/how-to/overview.md +++ b/wiki/src/aspnet/how-to/overview.md @@ -1,3 +1,5 @@ + + {{#include ../../shared/how-to/overview-pre.md}} >[!IMPORTANT] diff --git a/wiki/src/aspnet/how-to/requested-version.md b/wiki/src/aspnet/how-to/requested-version.md index 522302db..9b48ff02 100644 --- a/wiki/src/aspnet/how-to/requested-version.md +++ b/wiki/src/aspnet/how-to/requested-version.md @@ -1,3 +1,5 @@ + + {{#include ../../shared/how-to/requested-version-pre.md}} ### Web API diff --git a/wiki/src/aspnet/how-to/version-advertisement.md b/wiki/src/aspnet/how-to/version-advertisement.md index cb5bb131..0092af25 100644 --- a/wiki/src/aspnet/how-to/version-advertisement.md +++ b/wiki/src/aspnet/how-to/version-advertisement.md @@ -1,3 +1,5 @@ + + {{#include ../../shared/how-to/version-advertisement-pre.md}} ```c# diff --git a/wiki/src/aspnet/how-to/version-by-header.md b/wiki/src/aspnet/how-to/version-by-header.md index 9af32b00..17f912e3 100644 --- a/wiki/src/aspnet/how-to/version-by-header.md +++ b/wiki/src/aspnet/how-to/version-by-header.md @@ -1,3 +1,5 @@ + + {{#include ../../shared/how-to/version-by-header-pre.md}} ### Web API diff --git a/wiki/src/aspnet/how-to/version-by-media-type.md b/wiki/src/aspnet/how-to/version-by-media-type.md index d110927a..bdd2289a 100644 --- a/wiki/src/aspnet/how-to/version-by-media-type.md +++ b/wiki/src/aspnet/how-to/version-by-media-type.md @@ -1,3 +1,5 @@ + + {{#include ../../shared/how-to/version-by-media-type-pre.md}} ### Web API diff --git a/wiki/src/aspnet/how-to/version-by-query-string.md b/wiki/src/aspnet/how-to/version-by-query-string.md index 920d705d..60d14d0e 100644 --- a/wiki/src/aspnet/how-to/version-by-query-string.md +++ b/wiki/src/aspnet/how-to/version-by-query-string.md @@ -1,3 +1,5 @@ + + {{#include ../../shared/how-to/version-by-query-string-pre.md}} ### Web API diff --git a/wiki/src/aspnet/how-to/version-by-url.md b/wiki/src/aspnet/how-to/version-by-url.md index 1318a02f..b78b4fce 100644 --- a/wiki/src/aspnet/how-to/version-by-url.md +++ b/wiki/src/aspnet/how-to/version-by-url.md @@ -1,3 +1,5 @@ + + {{#include ../../shared/how-to/version-by-url-pre.md}} ### Web API diff --git a/wiki/src/aspnet/how-to/version-interleaving.md b/wiki/src/aspnet/how-to/version-interleaving.md index d13825ee..4742cc36 100644 --- a/wiki/src/aspnet/how-to/version-interleaving.md +++ b/wiki/src/aspnet/how-to/version-interleaving.md @@ -1,3 +1,5 @@ + + {{#include ../../shared/how-to/version-interleaving-pre.md}} ### Web API diff --git a/wiki/src/aspnet/how-to/version-neutral.md b/wiki/src/aspnet/how-to/version-neutral.md index e8dd7457..fcd2cb3d 100644 --- a/wiki/src/aspnet/how-to/version-neutral.md +++ b/wiki/src/aspnet/how-to/version-neutral.md @@ -1,3 +1,5 @@ + + {{#include ../../shared/how-to/version-neutral-pre.md}} ### Web API diff --git a/wiki/src/aspnet/limitations.md b/wiki/src/aspnet/limitations.md index b2a7483f..1d45210c 100644 --- a/wiki/src/aspnet/limitations.md +++ b/wiki/src/aspnet/limitations.md @@ -1,3 +1,5 @@ + + # Known Limitations ## URL Path Segment diff --git a/wiki/src/aspnet/odata/controllers.md b/wiki/src/aspnet/odata/controllers.md index 7ecd626e..a03af6d7 100644 --- a/wiki/src/aspnet/odata/controllers.md +++ b/wiki/src/aspnet/odata/controllers.md @@ -1 +1,3 @@ + + {{#include ../../shared/odata/controllers.md}} \ No newline at end of file diff --git a/wiki/src/aspnet/odata/metadata.md b/wiki/src/aspnet/odata/metadata.md index e5662e48..2c4974af 100644 --- a/wiki/src/aspnet/odata/metadata.md +++ b/wiki/src/aspnet/odata/metadata.md @@ -1 +1,3 @@ + + {{#include ../../shared/odata/metadata.md}} \ No newline at end of file diff --git a/wiki/src/aspnet/odata/model-builder.md b/wiki/src/aspnet/odata/model-builder.md index 4d93e265..b4c419e2 100644 --- a/wiki/src/aspnet/odata/model-builder.md +++ b/wiki/src/aspnet/odata/model-builder.md @@ -1,3 +1,5 @@ + + {{#include ../../shared/odata/model-builder-pre.md}} {{#include ../../shared/odata/model-builder-post.md}} \ No newline at end of file diff --git a/wiki/src/aspnet/odata/model-config.md b/wiki/src/aspnet/odata/model-config.md index facd3da5..31b8eded 100644 --- a/wiki/src/aspnet/odata/model-config.md +++ b/wiki/src/aspnet/odata/model-config.md @@ -1 +1,3 @@ + + {{#include ../../shared/odata/model-config.md}} \ No newline at end of file diff --git a/wiki/src/aspnet/odata/model-substitution.md b/wiki/src/aspnet/odata/model-substitution.md index b98dc00c..7704503b 100644 --- a/wiki/src/aspnet/odata/model-substitution.md +++ b/wiki/src/aspnet/odata/model-substitution.md @@ -1 +1,3 @@ + + {{#include ../../shared/odata/model-substitution.md}} \ No newline at end of file diff --git a/wiki/src/aspnet/odata/overview.md b/wiki/src/aspnet/odata/overview.md index 2027c737..e8037051 100644 --- a/wiki/src/aspnet/odata/overview.md +++ b/wiki/src/aspnet/odata/overview.md @@ -1,3 +1,5 @@ + + {{#include ../../shared/odata/overview-pre.md}} ```c# diff --git a/wiki/src/aspnet/odata/protocol-transition.md b/wiki/src/aspnet/odata/protocol-transition.md index f2d794e3..88ca6ee9 100644 --- a/wiki/src/aspnet/odata/protocol-transition.md +++ b/wiki/src/aspnet/odata/protocol-transition.md @@ -1,3 +1,5 @@ + + # Protocol Transitions One of the primary reasons to version a service is to facilitate changes in behavior and/or data exchange with the diff --git a/wiki/src/aspnet/quick-starts/existing-services.md b/wiki/src/aspnet/quick-starts/existing-services.md index 83d17c43..98e65c73 100644 --- a/wiki/src/aspnet/quick-starts/existing-services.md +++ b/wiki/src/aspnet/quick-starts/existing-services.md @@ -1,3 +1,5 @@ + + {{#include ../../shared/quick-starts/existing-services.md}} ### Web API diff --git a/wiki/src/aspnet/quick-starts/migration.md b/wiki/src/aspnet/quick-starts/migration.md index 78da3f64..940942d1 100644 --- a/wiki/src/aspnet/quick-starts/migration.md +++ b/wiki/src/aspnet/quick-starts/migration.md @@ -1,3 +1,5 @@ + + {{#include ../../shared/quick-starts/migration-overview.md}} ## Package Identifiers diff --git a/wiki/src/aspnet/quick-starts/new-services.md b/wiki/src/aspnet/quick-starts/new-services.md index c95167e0..ea6d1183 100644 --- a/wiki/src/aspnet/quick-starts/new-services.md +++ b/wiki/src/aspnet/quick-starts/new-services.md @@ -1,3 +1,5 @@ + + {{#include ../../shared/quick-starts/new-services.md}} ### Web API diff --git a/wiki/src/aspnet/version-discovery.md b/wiki/src/aspnet/version-discovery.md index 97a4160b..c1e1aa54 100644 --- a/wiki/src/aspnet/version-discovery.md +++ b/wiki/src/aspnet/version-discovery.md @@ -1,3 +1,5 @@ + + {{#include ../shared/version-discovery.md}} ### Web API diff --git a/wiki/src/aspnet/version-format.md b/wiki/src/aspnet/version-format.md index 2d1f44d6..feae6d5d 100644 --- a/wiki/src/aspnet/version-format.md +++ b/wiki/src/aspnet/version-format.md @@ -1 +1,3 @@ -{{#include ../shared/how-to/define-service-version.md}} \ No newline at end of file + + +{{#include ../shared/version-format.md}} \ No newline at end of file diff --git a/wiki/src/aspnet/version-policies.md b/wiki/src/aspnet/version-policies.md index ca044b94..004cc535 100644 --- a/wiki/src/aspnet/version-policies.md +++ b/wiki/src/aspnet/version-policies.md @@ -1,2 +1,4 @@ + + {{#include ../shared/version-policies.md}} \ No newline at end of file diff --git a/wiki/src/diagnostic/av0001.md b/wiki/src/diagnostic/av0001.md index 33d3049d..49bd2145 100644 --- a/wiki/src/diagnostic/av0001.md +++ b/wiki/src/diagnostic/av0001.md @@ -1,3 +1,5 @@ + + # AV0001: Invalid API version | | Value | diff --git a/wiki/src/diagnostic/av0002.md b/wiki/src/diagnostic/av0002.md index c379c9e6..f8687b12 100644 --- a/wiki/src/diagnostic/av0002.md +++ b/wiki/src/diagnostic/av0002.md @@ -1,3 +1,5 @@ + + # AV0002: Invalid API version range | | Value | diff --git a/wiki/src/diagnostic/av0003.md b/wiki/src/diagnostic/av0003.md index 366da1a6..d58017c4 100644 --- a/wiki/src/diagnostic/av0003.md +++ b/wiki/src/diagnostic/av0003.md @@ -1,3 +1,5 @@ + + # AV0003: Invalid API version status | | Value | diff --git a/wiki/src/diagnostic/av0004.md b/wiki/src/diagnostic/av0004.md index 9843466b..18cd6c4f 100644 --- a/wiki/src/diagnostic/av0004.md +++ b/wiki/src/diagnostic/av0004.md @@ -1,3 +1,5 @@ + + # AV0004: Invalid API version number | | Value | diff --git a/wiki/src/diagnostic/av0005.md b/wiki/src/diagnostic/av0005.md index 6ff45103..da8c3c30 100644 --- a/wiki/src/diagnostic/av0005.md +++ b/wiki/src/diagnostic/av0005.md @@ -1,3 +1,5 @@ + + # AV0005: Invalid API version year | | Value | diff --git a/wiki/src/diagnostic/av0006.md b/wiki/src/diagnostic/av0006.md index 24499d44..46db08dd 100644 --- a/wiki/src/diagnostic/av0006.md +++ b/wiki/src/diagnostic/av0006.md @@ -1,3 +1,5 @@ + + # AV0006: Invalid API version month | | Value | diff --git a/wiki/src/diagnostic/av0007.md b/wiki/src/diagnostic/av0007.md index f1ce7449..f3361725 100644 --- a/wiki/src/diagnostic/av0007.md +++ b/wiki/src/diagnostic/av0007.md @@ -1,3 +1,5 @@ + + # AV0007: Invalid API version day | | Value | diff --git a/wiki/src/diagnostic/av0008.md b/wiki/src/diagnostic/av0008.md index 57c5456b..af8d294e 100644 --- a/wiki/src/diagnostic/av0008.md +++ b/wiki/src/diagnostic/av0008.md @@ -1,3 +1,5 @@ + + # AV0008: Invalid API version date | | Value | diff --git a/wiki/src/diagnostic/av0009.md b/wiki/src/diagnostic/av0009.md index c0f02741..0770b5e2 100644 --- a/wiki/src/diagnostic/av0009.md +++ b/wiki/src/diagnostic/av0009.md @@ -1,3 +1,5 @@ + + # AV0009: Invalid API version format specifier | | Value | diff --git a/wiki/src/diagnostic/av0010.md b/wiki/src/diagnostic/av0010.md index c347c10a..7ba69c8d 100644 --- a/wiki/src/diagnostic/av0010.md +++ b/wiki/src/diagnostic/av0010.md @@ -1,3 +1,5 @@ + + # AV0010: Unexpected API version format | | Value | diff --git a/wiki/src/diagnostic/av0011.md b/wiki/src/diagnostic/av0011.md index 1620f8d4..e03922d6 100644 --- a/wiki/src/diagnostic/av0011.md +++ b/wiki/src/diagnostic/av0011.md @@ -1,3 +1,5 @@ + + # AV0011: Remove unnecessary default API version | | Value | diff --git a/wiki/src/diagnostic/av0012.md b/wiki/src/diagnostic/av0012.md index 98ec620c..27d65c1d 100644 --- a/wiki/src/diagnostic/av0012.md +++ b/wiki/src/diagnostic/av0012.md @@ -1,3 +1,5 @@ + + # AV0012: Invalid default API version | | Value | diff --git a/wiki/src/diagnostic/av0013.md b/wiki/src/diagnostic/av0013.md index be0259df..5c443fff 100644 --- a/wiki/src/diagnostic/av0013.md +++ b/wiki/src/diagnostic/av0013.md @@ -1,3 +1,5 @@ + + # AV0013: Missing AddMvc | | Value | diff --git a/wiki/src/diagnostic/av0014.md b/wiki/src/diagnostic/av0014.md index c3589237..199dd28d 100644 --- a/wiki/src/diagnostic/av0014.md +++ b/wiki/src/diagnostic/av0014.md @@ -1,3 +1,5 @@ + + # AV0014: Missing API behavior | | Value | diff --git a/wiki/src/diagnostic/av0015.md b/wiki/src/diagnostic/av0015.md index e25a5a74..29be74f6 100644 --- a/wiki/src/diagnostic/av0015.md +++ b/wiki/src/diagnostic/av0015.md @@ -1,3 +1,5 @@ + + # AV0015: Use a specific API version reader | | Value | diff --git a/wiki/src/diagnostic/av0016.md b/wiki/src/diagnostic/av0016.md index 8c6eeb40..8a9f7632 100644 --- a/wiki/src/diagnostic/av0016.md +++ b/wiki/src/diagnostic/av0016.md @@ -1,3 +1,5 @@ + + # AV0016: Do not assume default API version | | Value | diff --git a/wiki/src/diagnostic/av0017.md b/wiki/src/diagnostic/av0017.md index ff00b8bf..983976cb 100644 --- a/wiki/src/diagnostic/av0017.md +++ b/wiki/src/diagnostic/av0017.md @@ -1,3 +1,5 @@ + + # AV0017: Remove unnecessary default value | | Value | diff --git a/wiki/src/diagnostic/av0018.md b/wiki/src/diagnostic/av0018.md index 5c1ca216..2a8933e7 100644 --- a/wiki/src/diagnostic/av0018.md +++ b/wiki/src/diagnostic/av0018.md @@ -1,3 +1,5 @@ + + # AV0018: All endpoints are version-neutral | | Value | diff --git a/wiki/src/diagnostic/av0019.md b/wiki/src/diagnostic/av0019.md index e3c21ce3..c1102838 100644 --- a/wiki/src/diagnostic/av0019.md +++ b/wiki/src/diagnostic/av0019.md @@ -1,3 +1,5 @@ + + # AV0019: An API cannot be versioned and version-neutral at the same time | | Value | diff --git a/wiki/src/diagnostic/av0020.md b/wiki/src/diagnostic/av0020.md index 9d0c5042..2fbc4460 100644 --- a/wiki/src/diagnostic/av0020.md +++ b/wiki/src/diagnostic/av0020.md @@ -1,3 +1,5 @@ + + # AV0020: Remove unnecessary API explorer | | Value | diff --git a/wiki/src/diagnostic/av0021.md b/wiki/src/diagnostic/av0021.md index 0548f6bc..1decdcf6 100644 --- a/wiki/src/diagnostic/av0021.md +++ b/wiki/src/diagnostic/av0021.md @@ -1,3 +1,5 @@ + + # AV0021: Use the versioned API explorer | | Value | diff --git a/wiki/src/diagnostic/av0022.md b/wiki/src/diagnostic/av0022.md index 22b081fc..d7da2674 100644 --- a/wiki/src/diagnostic/av0022.md +++ b/wiki/src/diagnostic/av0022.md @@ -1,3 +1,5 @@ + + # AV0022: Missing AddOData | | Value | diff --git a/wiki/src/diagnostic/av0023.md b/wiki/src/diagnostic/av0023.md index 94611f48..2d59e133 100644 --- a/wiki/src/diagnostic/av0023.md +++ b/wiki/src/diagnostic/av0023.md @@ -1,3 +1,5 @@ + + # AV0023: Route components are ignored | | Value | diff --git a/wiki/src/diagnostic/av0024.md b/wiki/src/diagnostic/av0024.md index 3bd54c4a..7c79fecd 100644 --- a/wiki/src/diagnostic/av0024.md +++ b/wiki/src/diagnostic/av0024.md @@ -1,3 +1,5 @@ + + # AV0024: Remove unnecessary API explorer option | | Value | diff --git a/wiki/src/diagnostic/av0025.md b/wiki/src/diagnostic/av0025.md index b0d6a18b..c8d861d0 100644 --- a/wiki/src/diagnostic/av0025.md +++ b/wiki/src/diagnostic/av0025.md @@ -1,3 +1,5 @@ + + # AV0025: Missing OpenAPI document description | | Value | diff --git a/wiki/src/diagnostic/av0026.md b/wiki/src/diagnostic/av0026.md index 27096231..5974f099 100644 --- a/wiki/src/diagnostic/av0026.md +++ b/wiki/src/diagnostic/av0026.md @@ -1,3 +1,5 @@ + + # AV0026: Remove unnecessary group name format | | Value | diff --git a/wiki/src/diagnostic/av0027.md b/wiki/src/diagnostic/av0027.md index 0f33180f..059a5f47 100644 --- a/wiki/src/diagnostic/av0027.md +++ b/wiki/src/diagnostic/av0027.md @@ -1,3 +1,5 @@ + + # AV0027: Use DescribeApiVersions | | Value | diff --git a/wiki/src/diagnostic/av0028.md b/wiki/src/diagnostic/av0028.md index af72947e..69d751ef 100644 --- a/wiki/src/diagnostic/av0028.md +++ b/wiki/src/diagnostic/av0028.md @@ -1,3 +1,5 @@ + + # AV0028: Sunset policy takes effect before deprecation | | Value | diff --git a/wiki/src/diagnostic/av0029.md b/wiki/src/diagnostic/av0029.md index 8ffc685a..046ee489 100644 --- a/wiki/src/diagnostic/av0029.md +++ b/wiki/src/diagnostic/av0029.md @@ -1,3 +1,5 @@ + + # AV0029: Remove unnecessary OpenAPI services | | Value | diff --git a/wiki/src/diagnostic/av0030.md b/wiki/src/diagnostic/av0030.md index 54c60384..b79c907d 100644 --- a/wiki/src/diagnostic/av0030.md +++ b/wiki/src/diagnostic/av0030.md @@ -1,3 +1,5 @@ + + # AV0030: Missing WithDocumentPerVersion | | Value | diff --git a/wiki/src/diagnostic/av0031.md b/wiki/src/diagnostic/av0031.md index 67aec880..77384a16 100644 --- a/wiki/src/diagnostic/av0031.md +++ b/wiki/src/diagnostic/av0031.md @@ -1,3 +1,5 @@ + + # AV0031: Missing API explorer | | Value | diff --git a/wiki/src/diagnostic/overview.md b/wiki/src/diagnostic/overview.md index bfa2daa9..b392e578 100644 --- a/wiki/src/diagnostic/overview.md +++ b/wiki/src/diagnostic/overview.md @@ -1,3 +1,5 @@ + + # Diagnostic Code Analysis for ASP.NET API Versioning .NET compiler platform analyzers inspect application code for code quality and style issues using ASP.NET API diff --git a/wiki/src/getting-started.md b/wiki/src/getting-started.md index 06938877..ebb35392 100644 --- a/wiki/src/getting-started.md +++ b/wiki/src/getting-started.md @@ -1,3 +1,5 @@ + + # Getting Started The simplest way to get started is to install the library. diff --git a/wiki/src/og-image.png b/wiki/src/og-image.png new file mode 100644 index 0000000000000000000000000000000000000000..e0174f31ddf437e4e4d8948e307ca5393df77874 GIT binary patch literal 106257 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 H`1yYTd#LH+ literal 0 HcmV?d00001 diff --git a/wiki/theme/head.hbs b/wiki/theme/head.hbs new file mode 100644 index 00000000..006dc802 --- /dev/null +++ b/wiki/theme/head.hbs @@ -0,0 +1,32 @@ + + + + + + + + + +{{#if description}} + +{{/if}} + + + + +{{#if description}} + +{{/if}} diff --git a/wiki/tools/Add-PageMetadata.ps1 b/wiki/tools/Add-PageMetadata.ps1 new file mode 100644 index 00000000..1aa82acb --- /dev/null +++ b/wiki/tools/Add-PageMetadata.ps1 @@ -0,0 +1,141 @@ +<# +.SYNOPSIS +Injects per-page description, canonical, and Open Graph URL metadata into a built mdBook site. + +.DESCRIPTION +mdBook's description is book-level only: [book] description in book.toml applies to every page, +and the HTML renderer exposes no per-page equivalent. A preprocessor cannot supply one either -- +mdBook hands a preprocessor (PreprocessorContext, Book) and takes back only Book, so it can +rewrite chapter content but not the config the renderer reads for the page head. + +So pages declare their own description as an HTML comment in the markdown: + + + +Markdown passes the comment through verbatim, it renders invisibly, and mdBook's search indexer +ignores it. Crucially the comment lives in the *including* page rather than the shared partial, +so the aspnet/ and aspnet-core/ pages that share a body via {{#include ../shared/...}} still get +distinct descriptions. + +This script runs after `mdbook build`. For every page it lifts that comment into as +name="description", og:description, and twitter:description, and derives the absolute page URL for +og:url and -- which the Handlebars template cannot do, because mdBook +registers no string helpers and {{path}} is the source .md path. + +Rewriting is idempotent: existing tags it owns are removed before the fresh ones are inserted, so +running twice is harmless. + +.PARAMETER Book +Path to the generated book directory (the mdbook build output). + +.PARAMETER BaseUrl +Absolute origin the site is served from, used to build og:url and canonical. + +.PARAMETER Require +Fail the build when a page has no description comment. Off by default so descriptions can be +adopted a page at a time; pages without one simply get no description tags. + +.EXAMPLE + ./Add-PageMetadata.ps1 -Book ./wiki/book + ./Add-PageMetadata.ps1 -Book ./wiki/book -Require +#> +[CmdletBinding()] +param( + [Parameter(Mandatory = $true)][string]$Book, + [string]$BaseUrl = 'https://dotnet.github.io/aspnet-api-versioning', + [switch]$Require +) + +$ErrorActionPreference = 'Stop' + +if (-not (Test-Path -LiteralPath $Book)) { throw "book directory not found: $Book" } +$Book = (Resolve-Path $Book).Path +$BaseUrl = $BaseUrl.TrimEnd('/') + +$pages = Get-ChildItem -LiteralPath $Book -Recurse -Filter *.html -File +if (-not $pages) { throw "no HTML found under $Book - did mdbook build run?" } + +# Recommended upper bound before search engines truncate the snippet. +$maxLength = 160 + +$missing = New-Object System.Collections.Generic.List[string] +$long = New-Object System.Collections.Generic.List[object] +$written = 0 + +foreach ($p in $pages) { + $rel = $p.FullName.Substring($Book.Length).TrimStart('\', '/').Replace('\', '/') + + # 404.html is served for arbitrary URLs, so no single canonical applies. print.html + # concatenates every chapter, which would pick up the first page's description. + # toc.html is the sidebar fragment mdBook generates, not a navigable page. + if ($rel -eq '404.html' -or $rel -eq 'print.html' -or $rel -eq 'toc.html') { continue } + + $html = Get-Content -Raw -LiteralPath $p.FullName + + # Prefer the directory form so a page has one canonical spelling, not two. + if ($rel -eq 'index.html') { + $url = "$BaseUrl/" + } elseif ($rel.EndsWith('/index.html')) { + $url = "$BaseUrl/" + $rel.Substring(0, $rel.Length - 'index.html'.Length) + } else { + $url = "$BaseUrl/$rel" + } + + $description = $null + $m = [regex]::Match($html, '') + if ($m.Success) { + # Collapse any wrapping the author used to keep the source line readable. + $description = [regex]::Replace($m.Groups['text'].Value, '\s+', ' ').Trim() + } + + if ([string]::IsNullOrWhiteSpace($description)) { + $missing.Add($rel) + $description = $null + } elseif ($description.Length -gt $maxLength) { + $long.Add([pscustomobject]@{ Page = $rel; Length = $description.Length }) + } + + # --- drop the tags this script owns, so a re-run replaces rather than duplicates --- + $html = [regex]::Replace($html, '[ \t]*]*>\r?\n?', '') + $html = [regex]::Replace($html, '[ \t]*]*>\r?\n?', '') + $html = [regex]::Replace($html, '[ \t]*]*>\r?\n?', '') + $html = [regex]::Replace($html, '[ \t]*]*>\r?\n?', '') + $html = [regex]::Replace($html, '[ \t]*]*>\r?\n?', '') + + $tags = New-Object System.Collections.Generic.List[string] + if ($description) { + $escaped = [System.Net.WebUtility]::HtmlEncode($description) + $tags.Add("") + $tags.Add("") + $tags.Add("") + } + $tags.Add("") + $tags.Add("") + + $block = ($tags | ForEach-Object { " $_" }) -join "`n" + + if ($html -notmatch '') { throw "no in $rel" } + $html = [regex]::Replace($html, '', "$block`n ", 1) + + # -NoNewline: the content already carries its own trailing newline. + Set-Content -LiteralPath $p.FullName -Value $html -Encoding utf8NoBOM -NoNewline + $written++ +} + +Write-Output "wrote metadata to $written page(s); base url $BaseUrl" + +if ($long.Count -gt 0) { + Write-Output '' + Write-Output "LONG DESCRIPTIONS (over $maxLength chars, will be truncated in results): $($long.Count)" + foreach ($l in ($long | Sort-Object -Property Length -Descending)) { + Write-Output (" {0} ({1} chars)" -f $l.Page, $l.Length) + } +} + +if ($missing.Count -gt 0) { + Write-Output '' + Write-Output "PAGES WITHOUT A DESCRIPTION: $($missing.Count)" + Write-Output ' (add to the page markdown)' + foreach ($x in ($missing | Sort-Object)) { Write-Output " $x" } + if ($Require) { exit 1 } +} From 35b02355579009708055ed1a4bbd441f7d181906 Mon Sep 17 00:00:00 2001 From: Chris Martinez Date: Mon, 10 Aug 2026 20:59:27 -0700 Subject: [PATCH 5/6] Add custom 404 --- wiki/src/404.md | 28 +++++++++++++++++++ wiki/theme/custom.css | 65 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 93 insertions(+) create mode 100644 wiki/src/404.md diff --git a/wiki/src/404.md b/wiki/src/404.md new file mode 100644 index 00000000..2355e2bf --- /dev/null +++ b/wiki/src/404.md @@ -0,0 +1,28 @@ +
+ + + +# Not Found + +Slithered through every page and API version. This page isn't in any of them. + +```http +HTTP/2 404 +api-supported-versions: 1.0 +content-type: application/problem+json +content-length: 163 + +{ + "type": "https://docs.api-versioning.org/problems#unsupported", + "title": "Not Found", + "status": 404, + "detail": "No page matched that URL in any API version.", + "code": "UnsupportedApiVersion" +} +``` + +It may have been renamed, sunset without a deprecation policy, or never shipped at all. +Try the [Introduction](index.html) or [Getting Started](getting-started.md), or press +s to search. + +
diff --git a/wiki/theme/custom.css b/wiki/theme/custom.css index 808faee3..3c373c53 100644 --- a/wiki/theme/custom.css +++ b/wiki/theme/custom.css @@ -213,3 +213,68 @@ strong { .severity-error { color: rgb(192, 0, 0); } + +/* + * The 404 page, authored as src/404.md. The logo mark is a ring, so it stands in for + * the zero of "404" rather than sitting beside it. The ring reads as static while the + * cobra inside it sways, which is the whole reason the rotation is on the mark itself. + */ +.not-found { + text-align: center; +} + +.not-found-code { + display: flex; + align-items: center; + justify-content: center; + gap: 0.05em; + /* Scales with the viewport so the mark stays legible on a phone without + overflowing the content column on a wide screen. */ + font-size: clamp(3.5rem, 16vw, 8rem); + font-weight: 700; + line-height: 1; + margin-bottom: 0.25em; +} + +.not-found-code .not-found-logo { + width: 1.15em; + height: 1.15em; + /* Resolved against this stylesheet, not the document, so the mdBook + sets on the 404 page does not apply. Same relative path as .menu-title::before. */ + background: url("../logo.svg") no-repeat center / contain; + animation: not-found-sway 5s ease-in-out infinite alternate; +} + +/* matches the header logo swap: the dark strokes vanish on the dark themes */ +.ayu .not-found-code .not-found-logo, +.coal .not-found-code .not-found-logo, +.navy .not-found-code .not-found-logo { + background-image: url("../logo-dark.svg"); +} + +@keyframes not-found-sway { + from { transform: rotate(-9deg); } + to { transform: rotate(9deg); } +} + +@media (prefers-reduced-motion: reduce) { + .not-found-code .not-found-logo { + animation: none; + } +} + +/* The headline is the page's own title; the numeral above it already shouts. */ +.not-found h1 { + margin-top: 0; +} + +/* + * Left-aligned so the response reads as a response. Sized to its content and centred + * rather than filling the column, so the two blocks line up as one quoted exchange. + */ +.not-found pre { + text-align: left; + width: fit-content; + max-width: 100%; + margin-inline: auto; +} From 1667223f503104e5f06d71360cd5d5df3448c451 Mon Sep 17 00:00:00 2001 From: Chris Martinez Date: Mon, 10 Aug 2026 21:01:11 -0700 Subject: [PATCH 6/6] Bump patch version and add release notes --- .../src/Asp.Versioning.OpenApi/Asp.Versioning.OpenApi.csproj | 2 +- .../WebApi/src/Asp.Versioning.OpenApi/ReleaseNotes.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/AspNetCore/WebApi/src/Asp.Versioning.OpenApi/Asp.Versioning.OpenApi.csproj b/src/AspNetCore/WebApi/src/Asp.Versioning.OpenApi/Asp.Versioning.OpenApi.csproj index 1866056a..af1bb6d2 100644 --- a/src/AspNetCore/WebApi/src/Asp.Versioning.OpenApi/Asp.Versioning.OpenApi.csproj +++ b/src/AspNetCore/WebApi/src/Asp.Versioning.OpenApi/Asp.Versioning.OpenApi.csproj @@ -1,7 +1,7 @@  - 10.2.1 + 10.2.2 10.2.0.0 $(DefaultTargetFramework) Asp.Versioning.OpenApi diff --git a/src/AspNetCore/WebApi/src/Asp.Versioning.OpenApi/ReleaseNotes.txt b/src/AspNetCore/WebApi/src/Asp.Versioning.OpenApi/ReleaseNotes.txt index 2725eef9..114fecc8 100644 --- a/src/AspNetCore/WebApi/src/Asp.Versioning.OpenApi/ReleaseNotes.txt +++ b/src/AspNetCore/WebApi/src/Asp.Versioning.OpenApi/ReleaseNotes.txt @@ -1 +1 @@ -Bump patched version due to transitive dependency \ No newline at end of file +Fixed XML Comment whitespace handling [Issue #1205](https://github.com/dotnet/aspnet-api-versioning/issues/1205) \ No newline at end of file