Update dependency Asp.Versioning.Mvc.ApiExplorer to v10 - #136

Open
renovate[bot] wants to merge 1 commit into
masterfrom
renovate/asp.versioning.mvc.apiexplorer-10.x
Open

Update dependency Asp.Versioning.Mvc.ApiExplorer to v10#136
renovate[bot] wants to merge 1 commit into
masterfrom
renovate/asp.versioning.mvc.apiexplorer-10.x

Conversation

@renovate

@renovaterenovateBot commented Apr 24, 2026

Copy link
Copy Markdown
Contributor

This PR contains the following updates:

PackageChangeAgeAdoptionPassingConfidence
Asp.Versioning.Mvc.ApiExplorer (source)8.1.110.2.1ageadoptionpassingconfidence

Release Notes

dotnet/aspnet-api-versioning (Asp.Versioning.Mvc.ApiExplorer)

v10.2.0: 10.2.0

This release includes some big new features but is fully backward compatible with 10.0.0. The new features include versioned model member filtering, Roslyn analyzers, gRPC preview support, and a number of servicing patches since the previous release.

Fixes

All Platforms

  • Parsing an API version whose status ends in '.' no longer succeeds silently
  • Very large padding values in a format string no longer cause a stack overflow
  • Incorrect lower and upper bounds when matching API version ranges
  • Parsing a positive integer no longer allows whitespace or a leading '-'

ASP.NET Core

  • Routes are no longer incorrectly evicted from the route table (#​1138)
  • Fixed routing of unversioned endpoints
  • Fixed extracting an API version that includes a status when versioning by URL segment (#​1187)
  • A user-registered IProblemDetailsWriter is preserved by AddApiVersioning() (#​1191)

ASP.NET Core OpenAPI

  • Support for more XML comment tags (#​1205)
  • Fixed the error message reported for an unmapped JSON property
  • Fixed descriptions applied to filtered members

Features

All Platforms

  • New ApiVersionRange type for matching a set of API versions using the same interval notation as a package version
    • 1.0x ≥ 1.0
    • [1.0]x == 1.0
    • (1.0,)x > 1.0
    • (,1.0]x ≤ 1.0
    • [1.0,2.0)1.0 ≤ x < 2.0
    • Multiple rules are combined as a logical or; ApiVersionRange.Any and ApiVersionRange.Empty are provided for
      the degenerate cases
    • A range matches API versions; it does not define them. API versions must still be explicitly declared
  • New VisibleInApiVersionAttribute indicates the range of API versions a data member is visible in; for example,
    [VisibleInApiVersion("2.0")]
  • New IAnnotation<TKey, TValue> abstraction for associating out-of-band metadata with a member
  • [StringSyntax] is now applied to API version inputs so the IDE and analyzers understand them; the recognized
    syntaxes are ApiVersion, ApiVersionRange, and ApiVersionFormat

Analyzers

API Versioning now ships Roslyn analyzers. There is no new package to install — the core rules are packed into Asp.Versioning.Abstractions and the API rules are packed into Asp.Versioning.Http, so any application that already references API Versioning picks them up transitively.

There is an initial set of 31 rules. You can find all of the rule information in the new diagnostics wiki topic.

Notes:

  • Every rule has a helpLinkUri that resolves to its documentation page
  • Individual rules can be configured through .editorconfig as usual
  • All analyzers can be turned off with a single MSBuild property:
    <PropertyGroup>
    <EnableApiVersioningAnalyzers>false</EnableApiVersioningAnalyzers>
    </PropertyGroup>
    ExcludeAssets="analyzers" on a PackageReference will not work because the package is also reached through
    the dependencies of other packages and NuGet combines the assets from every path

ASP.NET Web API (Classic) is not currently supported. If there is demand, I will consider the support, but I presume
little new development is happening on the older platform.

ASP.NET Core

Data members can now be versioned independently of the endpoint that returns them. Annotate a property with [VisibleInApiVersion] and the member is omitted from responses for API versions outside the range:

publicclassPerson{publicintId{get;set;}publicstringFirstName{get;set;}[VisibleInApiVersion("2.0")]publicAddress?HomeAddress{get;set;}[VisibleInApiVersion("[1.0,2.0)")]publicstring?LegacyEmail{get;set;}}
  • Works for both Minimal APIs and MVC (Core)
  • Filtering members is currently only support for the JSON media type
  • Filtering applies on the way in as well as the way out, which closes the corresponding over-posting gap
  • AddApiVersioning() now registers IHttpContextAccessor so the requested API version is available during
    serialization
  • [VisibleInApiVersion] is part of the core abstractions and can be used in your model libraries without any
    dependency on ASP.NET

ASP.NET Core API Explorer

  • The API explorer describes only the model members visible in the API version being explored via the new
    VersionedModelMetadata, VersionedModelMetadataProvider, and DelegatingModelMetadata types
  • Only models that are actually explored are filtered for visibility

ASP.NET Core OpenAPI

  • Generated schemas reflect per-version member visibility, so the documented shape of a model matches what the API
    actually returns for that version
  • Significantly expanded XML comment support:
    • <remarks> now takes precedence over <description>
    • <b> and <i> are converted to and retained as Markdown
    • <a href="..."/> is converted to and retained as a hyperlink
    • <paramref name="..."/> is rendered as inline code
    • <list>, <item>, <term>, <description>, <value>, and <example> are supported
    • <inheritdoc/> is resolved for summaries
    • Multi-line code fences from <code> blocks are properly closed

ASP.NET Core with gRPC (Preview)

Two new packages add API Versioning to gRPC services: Asp.Versioning.Grpc and Asp.Versioning.Grpc.ApiExplorer. This is a new set of features that will run in preview to give gRPC service authors a chance to try things out and report any issues or gaps.

The following is a basic example showing all of the parts coming together.

services.AddApiVersioning().AddGrpc().AddGrpcApiExplorer().AddOpenApi();varpeople=app.NewVersionedApi("People");people.MapGrpcService<PeopleService>().HasApiVersion(1.0).HasApiVersion(2.0).HasApiVersion(3.0);
  • Services are versioned with the same conventions used everywhere else — a single implementation can support several
    API versions, or implementations can be split across versions
  • Message fields are annotated with the API versions they belong to using the new asp/api/annotations.proto:
    import"asp/api/annotations.proto";
    messagePerson {
    int32id=1;
    stringfirst_name=2;
    stringlast_name=3;
    Addresshome_address=4 [(asp.api.version) = "2.0"];
    stringphone=5 [(asp.api.version) = "3.0"];
    }
    • The option is repeated, so a field split across disjoint ranges repeats the option
    • A field with no annotation is included in every API version
  • A server interceptor filters fields out of requests and responses — including streaming in both directions — so a
    client on 1.0 can neither see nor post a field that was introduced in 3.0
  • JSON transcoded gRPC services are described by the API explorer and appear in the OpenAPI document with the API
    version route segment and well-known protobuf types mapped to their correct schemas

The gRPC OpenAPI Example demonstrates an end-to-end working solution.

Breaking Changes

All Platforms

  • The analyzers are on by default. They ship inside Asp.Versioning.Abstractions and Asp.Versioning.Http, which
    means upgrading turns them on for every project that references API versioning — directly or transitively. AV0012,
    AV0018, and AV0019 default to error severity, so an existing application that trips one of them will fail to build
    until the underlying problem is fixed, the rule is downgraded in .editorconfig, or
    <EnableApiVersioningAnalyzers>false</EnableApiVersioningAnalyzers> is set. Before these rules existed, an
    application should have either encountered runtime exceptions or not functioned as expected. These rules are catching
    mistakes early rather than imposing specific dogma about how your application must be defined.

ASP.NET Core

  • AddApiVersioning() now calls AddHttpContextAccessor(). This is additive and should be transparent, but it does mean
    IHttpContextAccessor is registered in applications that previously did not have it

Documentation

The wiki has served the community well for many years, but it had gotten tired and it was due for some much needed love and updates. I've reworked the wiki into a new GitHub Pages site using mdBook.

  • The wiki has been ported to GitHub Pages and is now published at dotnet.github.io/aspnet-api-versioning with search, per-page tables of contents, and side-by-side content for each supported flavor of ASP.NET
  • README badges and links throughout the repository now point at the new site
  • The old wiki pages still exist so that old links are not broken
    • All future links should link to the new content

Why change?

  • There was little-to-no control over wiki page names, which makes it difficult for SEO
  • The wiki HTML support is much more limited that GitHub Pages
    • Theming is also supported
  • The wiki was considerable in size, but you couldn't search it; now you can
  • The project started with ASP.NET Web API (Classic) a decade ago, but ASP.NET Core is now the de facto platform
    • ASP.NET Core and Web API (Classic) have been split apart
    • There will be overlap in search, but everything else is cleanly separated
  • Errors and updates. There has never been a good way for the community to create pull requests to update content
  • The content lifecycle was outside of the repository content; now it's side-by-side
    • This helps keep the content current and fresh
  • Printing now has first-class support

It certainly possible that some links or content are incorrect after the migration. Please report any errors or submit a pull request
and they will be fixed promptly.

Release Notes

  • Package release notes are now emitted through the PackageReleaseNotes property instead of being appended to the
    package README (#​1211)
  • Asp.Versioning.OData and Asp.Versioning.OpenAPI are no longer rc; both were promoted to stable during servicing and ship as 10.2.0
  • Asp.Versioning.Grpc and Asp.Versioning.Grpc.ApiExplorer are new in this release and ship at 10.2.0-preview.1 alongside everything else
  • Microsoft.OpenApi was updated to 2.7.5 due to a vulnerability and pinned to below 3.0.0 after a major version
    incompatibility

Feedback

Thanks to everyone who contributed to this release, whether through code, issues, or test driving the changes.

v10.0.0: 10.0.0

The official release for 10.0 is here! In addition to the changes in the preview releases, there are a few additional changes.

Features
All Platforms
  • ApiVersionAttribute, MapToVersionAttribute, and AdvertiseApiVersionsAttribute all now have a constructor which can support the date format without being a string; for example, [ApiVersion(2026, 04, 01)]
ASP.NET Core OpenAPI
  • XmlCommentsTransformer is now resolved via DI, which allows it to be re-registered with a user-defined file path
  • Public types and members are now virtual for developer extensibility
Fixes
ASP.NET Core OpenAPI
  • Fix comparison between entry and calling assembly (#​1175)
  • Ensure keyed services are registered with a lowercase key (#​1176)
  • Fix nested key service resolution (#​1177)
  • Implement IKeyedServiceProvider when injecting ApiVersion (#​1178)
Breaking Changes
ASP.NET Core OpenAPI
  • OpenAPI documents use "enum": ["1.0"] instead of "default": "1.0"
    • This has a similar effect, but removes the free-form input when the value is bounded
    • When optional, the enum value can still be deleted/removed
    • Some UIs, such as Scalar, still provide a way to provide an enumerated value that isn't in the list
Release Notes
Feedback

Thanks to the contributors on this release whether it was code contributions or test driving the previews. Special thanks to @​sander1095 for being a strong advocate and helping to bring even more visibility to the project.


Configuration

📅 Schedule: (UTC)

  • Branch creation
    • At any time (no schedule defined)
  • Automerge
    • At any time (no schedule defined)

🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 Ignore: Close this PR and you won't be reminded about this update again.


  • If you want to rebase/retry this PR, check this box

This PR was generated by Mend Renovate. View the repository job log.

@renovate
renovateBotforce-pushed the renovate/asp.versioning.mvc.apiexplorer-10.x branch from 333d3dd to a9e24e1CompareMay 18, 2026 09:46
@renovate
renovateBotforce-pushed the renovate/asp.versioning.mvc.apiexplorer-10.x branch from a9e24e1 to f5be012CompareJuly 12, 2026 17:47
@renovate
renovateBotforce-pushed the renovate/asp.versioning.mvc.apiexplorer-10.x branch 2 times, most recently from 52df7bd to ef300feCompareAugust 9, 2026 05:27
@renovate
renovateBotforce-pushed the renovate/asp.versioning.mvc.apiexplorer-10.x branch from ef300fe to 6c6b8e3CompareAugust 9, 2026 21:56
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Update dependency Asp.Versioning.Mvc.ApiExplorer to v10 - #136

Open
renovate[bot] wants to merge 1 commit into
masterfrom
renovate/asp.versioning.mvc.apiexplorer-10.x
Open

Update dependency Asp.Versioning.Mvc.ApiExplorer to v10#136
renovate[bot] wants to merge 1 commit into
masterfrom
renovate/asp.versioning.mvc.apiexplorer-10.x

Conversation

@renovate

@renovaterenovateBot commented Apr 24, 2026

Copy link
Copy Markdown
Contributor

This PR contains the following updates:

PackageChangeAgeAdoptionPassingConfidence
Asp.Versioning.Mvc.ApiExplorer (source)8.1.110.2.1ageadoptionpassingconfidence

Release Notes

dotnet/aspnet-api-versioning (Asp.Versioning.Mvc.ApiExplorer)

v10.2.0: 10.2.0

This release includes some big new features but is fully backward compatible with 10.0.0. The new features include versioned model member filtering, Roslyn analyzers, gRPC preview support, and a number of servicing patches since the previous release.

Fixes

All Platforms

  • Parsing an API version whose status ends in '.' no longer succeeds silently
  • Very large padding values in a format string no longer cause a stack overflow
  • Incorrect lower and upper bounds when matching API version ranges
  • Parsing a positive integer no longer allows whitespace or a leading '-'

ASP.NET Core

  • Routes are no longer incorrectly evicted from the route table (#​1138)
  • Fixed routing of unversioned endpoints
  • Fixed extracting an API version that includes a status when versioning by URL segment (#​1187)
  • A user-registered IProblemDetailsWriter is preserved by AddApiVersioning() (#​1191)

ASP.NET Core OpenAPI

  • Support for more XML comment tags (#​1205)
  • Fixed the error message reported for an unmapped JSON property
  • Fixed descriptions applied to filtered members

Features

All Platforms

  • New ApiVersionRange type for matching a set of API versions using the same interval notation as a package version
    • 1.0x ≥ 1.0
    • [1.0]x == 1.0
    • (1.0,)x > 1.0
    • (,1.0]x ≤ 1.0
    • [1.0,2.0)1.0 ≤ x < 2.0
    • Multiple rules are combined as a logical or; ApiVersionRange.Any and ApiVersionRange.Empty are provided for
      the degenerate cases
    • A range matches API versions; it does not define them. API versions must still be explicitly declared
  • New VisibleInApiVersionAttribute indicates the range of API versions a data member is visible in; for example,
    [VisibleInApiVersion("2.0")]
  • New IAnnotation<TKey, TValue> abstraction for associating out-of-band metadata with a member
  • [StringSyntax] is now applied to API version inputs so the IDE and analyzers understand them; the recognized
    syntaxes are ApiVersion, ApiVersionRange, and ApiVersionFormat

Analyzers

API Versioning now ships Roslyn analyzers. There is no new package to install — the core rules are packed into Asp.Versioning.Abstractions and the API rules are packed into Asp.Versioning.Http, so any application that already references API Versioning picks them up transitively.

There is an initial set of 31 rules. You can find all of the rule information in the new diagnostics wiki topic.

Notes:

  • Every rule has a helpLinkUri that resolves to its documentation page
  • Individual rules can be configured through .editorconfig as usual
  • All analyzers can be turned off with a single MSBuild property:
    <PropertyGroup>
    <EnableApiVersioningAnalyzers>false</EnableApiVersioningAnalyzers>
    </PropertyGroup>
    ExcludeAssets="analyzers" on a PackageReference will not work because the package is also reached through
    the dependencies of other packages and NuGet combines the assets from every path

ASP.NET Web API (Classic) is not currently supported. If there is demand, I will consider the support, but I presume
little new development is happening on the older platform.

ASP.NET Core

Data members can now be versioned independently of the endpoint that returns them. Annotate a property with [VisibleInApiVersion] and the member is omitted from responses for API versions outside the range:

publicclassPerson{publicintId{get;set;}publicstringFirstName{get;set;}[VisibleInApiVersion("2.0")]publicAddress?HomeAddress{get;set;}[VisibleInApiVersion("[1.0,2.0)")]publicstring?LegacyEmail{get;set;}}
  • Works for both Minimal APIs and MVC (Core)
  • Filtering members is currently only support for the JSON media type
  • Filtering applies on the way in as well as the way out, which closes the corresponding over-posting gap
  • AddApiVersioning() now registers IHttpContextAccessor so the requested API version is available during
    serialization
  • [VisibleInApiVersion] is part of the core abstractions and can be used in your model libraries without any
    dependency on ASP.NET

ASP.NET Core API Explorer

  • The API explorer describes only the model members visible in the API version being explored via the new
    VersionedModelMetadata, VersionedModelMetadataProvider, and DelegatingModelMetadata types
  • Only models that are actually explored are filtered for visibility

ASP.NET Core OpenAPI

  • Generated schemas reflect per-version member visibility, so the documented shape of a model matches what the API
    actually returns for that version
  • Significantly expanded XML comment support:
    • <remarks> now takes precedence over <description>
    • <b> and <i> are converted to and retained as Markdown
    • <a href="..."/> is converted to and retained as a hyperlink
    • <paramref name="..."/> is rendered as inline code
    • <list>, <item>, <term>, <description>, <value>, and <example> are supported
    • <inheritdoc/> is resolved for summaries
    • Multi-line code fences from <code> blocks are properly closed

ASP.NET Core with gRPC (Preview)

Two new packages add API Versioning to gRPC services: Asp.Versioning.Grpc and Asp.Versioning.Grpc.ApiExplorer. This is a new set of features that will run in preview to give gRPC service authors a chance to try things out and report any issues or gaps.

The following is a basic example showing all of the parts coming together.

services.AddApiVersioning().AddGrpc().AddGrpcApiExplorer().AddOpenApi();varpeople=app.NewVersionedApi("People");people.MapGrpcService<PeopleService>().HasApiVersion(1.0).HasApiVersion(2.0).HasApiVersion(3.0);
  • Services are versioned with the same conventions used everywhere else — a single implementation can support several
    API versions, or implementations can be split across versions
  • Message fields are annotated with the API versions they belong to using the new asp/api/annotations.proto:
    import"asp/api/annotations.proto";
    messagePerson {
    int32id=1;
    stringfirst_name=2;
    stringlast_name=3;
    Addresshome_address=4 [(asp.api.version) = "2.0"];
    stringphone=5 [(asp.api.version) = "3.0"];
    }
    • The option is repeated, so a field split across disjoint ranges repeats the option
    • A field with no annotation is included in every API version
  • A server interceptor filters fields out of requests and responses — including streaming in both directions — so a
    client on 1.0 can neither see nor post a field that was introduced in 3.0
  • JSON transcoded gRPC services are described by the API explorer and appear in the OpenAPI document with the API
    version route segment and well-known protobuf types mapped to their correct schemas

The gRPC OpenAPI Example demonstrates an end-to-end working solution.

Breaking Changes

All Platforms

  • The analyzers are on by default. They ship inside Asp.Versioning.Abstractions and Asp.Versioning.Http, which
    means upgrading turns them on for every project that references API versioning — directly or transitively. AV0012,
    AV0018, and AV0019 default to error severity, so an existing application that trips one of them will fail to build
    until the underlying problem is fixed, the rule is downgraded in .editorconfig, or
    <EnableApiVersioningAnalyzers>false</EnableApiVersioningAnalyzers> is set. Before these rules existed, an
    application should have either encountered runtime exceptions or not functioned as expected. These rules are catching
    mistakes early rather than imposing specific dogma about how your application must be defined.

ASP.NET Core

  • AddApiVersioning() now calls AddHttpContextAccessor(). This is additive and should be transparent, but it does mean
    IHttpContextAccessor is registered in applications that previously did not have it

Documentation

The wiki has served the community well for many years, but it had gotten tired and it was due for some much needed love and updates. I've reworked the wiki into a new GitHub Pages site using mdBook.

  • The wiki has been ported to GitHub Pages and is now published at dotnet.github.io/aspnet-api-versioning with search, per-page tables of contents, and side-by-side content for each supported flavor of ASP.NET
  • README badges and links throughout the repository now point at the new site
  • The old wiki pages still exist so that old links are not broken
    • All future links should link to the new content

Why change?

  • There was little-to-no control over wiki page names, which makes it difficult for SEO
  • The wiki HTML support is much more limited that GitHub Pages
    • Theming is also supported
  • The wiki was considerable in size, but you couldn't search it; now you can
  • The project started with ASP.NET Web API (Classic) a decade ago, but ASP.NET Core is now the de facto platform
    • ASP.NET Core and Web API (Classic) have been split apart
    • There will be overlap in search, but everything else is cleanly separated
  • Errors and updates. There has never been a good way for the community to create pull requests to update content
  • The content lifecycle was outside of the repository content; now it's side-by-side
    • This helps keep the content current and fresh
  • Printing now has first-class support

It certainly possible that some links or content are incorrect after the migration. Please report any errors or submit a pull request
and they will be fixed promptly.

Release Notes

  • Package release notes are now emitted through the PackageReleaseNotes property instead of being appended to the
    package README (#​1211)
  • Asp.Versioning.OData and Asp.Versioning.OpenAPI are no longer rc; both were promoted to stable during servicing and ship as 10.2.0
  • Asp.Versioning.Grpc and Asp.Versioning.Grpc.ApiExplorer are new in this release and ship at 10.2.0-preview.1 alongside everything else
  • Microsoft.OpenApi was updated to 2.7.5 due to a vulnerability and pinned to below 3.0.0 after a major version
    incompatibility

Feedback

Thanks to everyone who contributed to this release, whether through code, issues, or test driving the changes.

v10.0.0: 10.0.0

The official release for 10.0 is here! In addition to the changes in the preview releases, there are a few additional changes.

Features
All Platforms
  • ApiVersionAttribute, MapToVersionAttribute, and AdvertiseApiVersionsAttribute all now have a constructor which can support the date format without being a string; for example, [ApiVersion(2026, 04, 01)]
ASP.NET Core OpenAPI
  • XmlCommentsTransformer is now resolved via DI, which allows it to be re-registered with a user-defined file path
  • Public types and members are now virtual for developer extensibility
Fixes
ASP.NET Core OpenAPI
  • Fix comparison between entry and calling assembly (#​1175)
  • Ensure keyed services are registered with a lowercase key (#​1176)
  • Fix nested key service resolution (#​1177)
  • Implement IKeyedServiceProvider when injecting ApiVersion (#​1178)
Breaking Changes
ASP.NET Core OpenAPI
  • OpenAPI documents use "enum": ["1.0"] instead of "default": "1.0"
    • This has a similar effect, but removes the free-form input when the value is bounded
    • When optional, the enum value can still be deleted/removed
    • Some UIs, such as Scalar, still provide a way to provide an enumerated value that isn't in the list
Release Notes
Feedback

Thanks to the contributors on this release whether it was code contributions or test driving the previews. Special thanks to @​sander1095 for being a strong advocate and helping to bring even more visibility to the project.


Configuration

📅 Schedule: (UTC)

  • Branch creation
    • At any time (no schedule defined)
  • Automerge
    • At any time (no schedule defined)

🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 Ignore: Close this PR and you won't be reminded about this update again.


  • If you want to rebase/retry this PR, check this box

This PR was generated by Mend Renovate. View the repository job log.

@renovate
renovateBotforce-pushed the renovate/asp.versioning.mvc.apiexplorer-10.x branch from 333d3dd to a9e24e1CompareMay 18, 2026 09:46
@renovate
renovateBotforce-pushed the renovate/asp.versioning.mvc.apiexplorer-10.x branch from a9e24e1 to f5be012CompareJuly 12, 2026 17:47
@renovate
renovateBotforce-pushed the renovate/asp.versioning.mvc.apiexplorer-10.x branch 2 times, most recently from 52df7bd to ef300feCompareAugust 9, 2026 05:27
@renovate
renovateBotforce-pushed the renovate/asp.versioning.mvc.apiexplorer-10.x branch from ef300fe to 6c6b8e3CompareAugust 9, 2026 21:56
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Update dependency Asp.Versioning.Mvc.ApiExplorer to v10 - #136

Open
renovate[bot] wants to merge 1 commit into
masterfrom
renovate/asp.versioning.mvc.apiexplorer-10.x
Open

Update dependency Asp.Versioning.Mvc.ApiExplorer to v10#136
renovate[bot] wants to merge 1 commit into
masterfrom
renovate/asp.versioning.mvc.apiexplorer-10.x

Conversation

@renovate

@renovaterenovateBot commented Apr 24, 2026

Copy link
Copy Markdown
Contributor

This PR contains the following updates:

PackageChangeAgeAdoptionPassingConfidence
Asp.Versioning.Mvc.ApiExplorer (source)8.1.110.2.1ageadoptionpassingconfidence

Release Notes

dotnet/aspnet-api-versioning (Asp.Versioning.Mvc.ApiExplorer)

v10.2.0: 10.2.0

This release includes some big new features but is fully backward compatible with 10.0.0. The new features include versioned model member filtering, Roslyn analyzers, gRPC preview support, and a number of servicing patches since the previous release.

Fixes

All Platforms

  • Parsing an API version whose status ends in '.' no longer succeeds silently
  • Very large padding values in a format string no longer cause a stack overflow
  • Incorrect lower and upper bounds when matching API version ranges
  • Parsing a positive integer no longer allows whitespace or a leading '-'

ASP.NET Core

  • Routes are no longer incorrectly evicted from the route table (#​1138)
  • Fixed routing of unversioned endpoints
  • Fixed extracting an API version that includes a status when versioning by URL segment (#​1187)
  • A user-registered IProblemDetailsWriter is preserved by AddApiVersioning() (#​1191)

ASP.NET Core OpenAPI

  • Support for more XML comment tags (#​1205)
  • Fixed the error message reported for an unmapped JSON property
  • Fixed descriptions applied to filtered members

Features

All Platforms

  • New ApiVersionRange type for matching a set of API versions using the same interval notation as a package version
    • 1.0x ≥ 1.0
    • [1.0]x == 1.0
    • (1.0,)x > 1.0
    • (,1.0]x ≤ 1.0
    • [1.0,2.0)1.0 ≤ x < 2.0
    • Multiple rules are combined as a logical or; ApiVersionRange.Any and ApiVersionRange.Empty are provided for
      the degenerate cases
    • A range matches API versions; it does not define them. API versions must still be explicitly declared
  • New VisibleInApiVersionAttribute indicates the range of API versions a data member is visible in; for example,
    [VisibleInApiVersion("2.0")]
  • New IAnnotation<TKey, TValue> abstraction for associating out-of-band metadata with a member
  • [StringSyntax] is now applied to API version inputs so the IDE and analyzers understand them; the recognized
    syntaxes are ApiVersion, ApiVersionRange, and ApiVersionFormat

Analyzers

API Versioning now ships Roslyn analyzers. There is no new package to install — the core rules are packed into Asp.Versioning.Abstractions and the API rules are packed into Asp.Versioning.Http, so any application that already references API Versioning picks them up transitively.

There is an initial set of 31 rules. You can find all of the rule information in the new diagnostics wiki topic.

Notes:

  • Every rule has a helpLinkUri that resolves to its documentation page
  • Individual rules can be configured through .editorconfig as usual
  • All analyzers can be turned off with a single MSBuild property:
    <PropertyGroup>
    <EnableApiVersioningAnalyzers>false</EnableApiVersioningAnalyzers>
    </PropertyGroup>
    ExcludeAssets="analyzers" on a PackageReference will not work because the package is also reached through
    the dependencies of other packages and NuGet combines the assets from every path

ASP.NET Web API (Classic) is not currently supported. If there is demand, I will consider the support, but I presume
little new development is happening on the older platform.

ASP.NET Core

Data members can now be versioned independently of the endpoint that returns them. Annotate a property with [VisibleInApiVersion] and the member is omitted from responses for API versions outside the range:

publicclassPerson{publicintId{get;set;}publicstringFirstName{get;set;}[VisibleInApiVersion("2.0")]publicAddress?HomeAddress{get;set;}[VisibleInApiVersion("[1.0,2.0)")]publicstring?LegacyEmail{get;set;}}
  • Works for both Minimal APIs and MVC (Core)
  • Filtering members is currently only support for the JSON media type
  • Filtering applies on the way in as well as the way out, which closes the corresponding over-posting gap
  • AddApiVersioning() now registers IHttpContextAccessor so the requested API version is available during
    serialization
  • [VisibleInApiVersion] is part of the core abstractions and can be used in your model libraries without any
    dependency on ASP.NET

ASP.NET Core API Explorer

  • The API explorer describes only the model members visible in the API version being explored via the new
    VersionedModelMetadata, VersionedModelMetadataProvider, and DelegatingModelMetadata types
  • Only models that are actually explored are filtered for visibility

ASP.NET Core OpenAPI

  • Generated schemas reflect per-version member visibility, so the documented shape of a model matches what the API
    actually returns for that version
  • Significantly expanded XML comment support:
    • <remarks> now takes precedence over <description>
    • <b> and <i> are converted to and retained as Markdown
    • <a href="..."/> is converted to and retained as a hyperlink
    • <paramref name="..."/> is rendered as inline code
    • <list>, <item>, <term>, <description>, <value>, and <example> are supported
    • <inheritdoc/> is resolved for summaries
    • Multi-line code fences from <code> blocks are properly closed

ASP.NET Core with gRPC (Preview)

Two new packages add API Versioning to gRPC services: Asp.Versioning.Grpc and Asp.Versioning.Grpc.ApiExplorer. This is a new set of features that will run in preview to give gRPC service authors a chance to try things out and report any issues or gaps.

The following is a basic example showing all of the parts coming together.

services.AddApiVersioning().AddGrpc().AddGrpcApiExplorer().AddOpenApi();varpeople=app.NewVersionedApi("People");people.MapGrpcService<PeopleService>().HasApiVersion(1.0).HasApiVersion(2.0).HasApiVersion(3.0);
  • Services are versioned with the same conventions used everywhere else — a single implementation can support several
    API versions, or implementations can be split across versions
  • Message fields are annotated with the API versions they belong to using the new asp/api/annotations.proto:
    import"asp/api/annotations.proto";
    messagePerson {
    int32id=1;
    stringfirst_name=2;
    stringlast_name=3;
    Addresshome_address=4 [(asp.api.version) = "2.0"];
    stringphone=5 [(asp.api.version) = "3.0"];
    }
    • The option is repeated, so a field split across disjoint ranges repeats the option
    • A field with no annotation is included in every API version
  • A server interceptor filters fields out of requests and responses — including streaming in both directions — so a
    client on 1.0 can neither see nor post a field that was introduced in 3.0
  • JSON transcoded gRPC services are described by the API explorer and appear in the OpenAPI document with the API
    version route segment and well-known protobuf types mapped to their correct schemas

The gRPC OpenAPI Example demonstrates an end-to-end working solution.

Breaking Changes

All Platforms

  • The analyzers are on by default. They ship inside Asp.Versioning.Abstractions and Asp.Versioning.Http, which
    means upgrading turns them on for every project that references API versioning — directly or transitively. AV0012,
    AV0018, and AV0019 default to error severity, so an existing application that trips one of them will fail to build
    until the underlying problem is fixed, the rule is downgraded in .editorconfig, or
    <EnableApiVersioningAnalyzers>false</EnableApiVersioningAnalyzers> is set. Before these rules existed, an
    application should have either encountered runtime exceptions or not functioned as expected. These rules are catching
    mistakes early rather than imposing specific dogma about how your application must be defined.

ASP.NET Core

  • AddApiVersioning() now calls AddHttpContextAccessor(). This is additive and should be transparent, but it does mean
    IHttpContextAccessor is registered in applications that previously did not have it

Documentation

The wiki has served the community well for many years, but it had gotten tired and it was due for some much needed love and updates. I've reworked the wiki into a new GitHub Pages site using mdBook.

  • The wiki has been ported to GitHub Pages and is now published at dotnet.github.io/aspnet-api-versioning with search, per-page tables of contents, and side-by-side content for each supported flavor of ASP.NET
  • README badges and links throughout the repository now point at the new site
  • The old wiki pages still exist so that old links are not broken
    • All future links should link to the new content

Why change?

  • There was little-to-no control over wiki page names, which makes it difficult for SEO
  • The wiki HTML support is much more limited that GitHub Pages
    • Theming is also supported
  • The wiki was considerable in size, but you couldn't search it; now you can
  • The project started with ASP.NET Web API (Classic) a decade ago, but ASP.NET Core is now the de facto platform
    • ASP.NET Core and Web API (Classic) have been split apart
    • There will be overlap in search, but everything else is cleanly separated
  • Errors and updates. There has never been a good way for the community to create pull requests to update content
  • The content lifecycle was outside of the repository content; now it's side-by-side
    • This helps keep the content current and fresh
  • Printing now has first-class support

It certainly possible that some links or content are incorrect after the migration. Please report any errors or submit a pull request
and they will be fixed promptly.

Release Notes

  • Package release notes are now emitted through the PackageReleaseNotes property instead of being appended to the
    package README (#​1211)
  • Asp.Versioning.OData and Asp.Versioning.OpenAPI are no longer rc; both were promoted to stable during servicing and ship as 10.2.0
  • Asp.Versioning.Grpc and Asp.Versioning.Grpc.ApiExplorer are new in this release and ship at 10.2.0-preview.1 alongside everything else
  • Microsoft.OpenApi was updated to 2.7.5 due to a vulnerability and pinned to below 3.0.0 after a major version
    incompatibility

Feedback

Thanks to everyone who contributed to this release, whether through code, issues, or test driving the changes.

v10.0.0: 10.0.0

The official release for 10.0 is here! In addition to the changes in the preview releases, there are a few additional changes.

Features
All Platforms
  • ApiVersionAttribute, MapToVersionAttribute, and AdvertiseApiVersionsAttribute all now have a constructor which can support the date format without being a string; for example, [ApiVersion(2026, 04, 01)]
ASP.NET Core OpenAPI
  • XmlCommentsTransformer is now resolved via DI, which allows it to be re-registered with a user-defined file path
  • Public types and members are now virtual for developer extensibility
Fixes
ASP.NET Core OpenAPI
  • Fix comparison between entry and calling assembly (#​1175)
  • Ensure keyed services are registered with a lowercase key (#​1176)
  • Fix nested key service resolution (#​1177)
  • Implement IKeyedServiceProvider when injecting ApiVersion (#​1178)
Breaking Changes
ASP.NET Core OpenAPI
  • OpenAPI documents use "enum": ["1.0"] instead of "default": "1.0"
    • This has a similar effect, but removes the free-form input when the value is bounded
    • When optional, the enum value can still be deleted/removed
    • Some UIs, such as Scalar, still provide a way to provide an enumerated value that isn't in the list
Release Notes
Feedback

Thanks to the contributors on this release whether it was code contributions or test driving the previews. Special thanks to @​sander1095 for being a strong advocate and helping to bring even more visibility to the project.


Configuration

📅 Schedule: (UTC)

  • Branch creation
    • At any time (no schedule defined)
  • Automerge
    • At any time (no schedule defined)

🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 Ignore: Close this PR and you won't be reminded about this update again.


  • If you want to rebase/retry this PR, check this box

This PR was generated by Mend Renovate. View the repository job log.

@renovate
renovateBotforce-pushed the renovate/asp.versioning.mvc.apiexplorer-10.x branch from 333d3dd to a9e24e1CompareMay 18, 2026 09:46
@renovate
renovateBotforce-pushed the renovate/asp.versioning.mvc.apiexplorer-10.x branch from a9e24e1 to f5be012CompareJuly 12, 2026 17:47
@renovate
renovateBotforce-pushed the renovate/asp.versioning.mvc.apiexplorer-10.x branch 2 times, most recently from 52df7bd to ef300feCompareAugust 9, 2026 05:27
@renovate
renovateBotforce-pushed the renovate/asp.versioning.mvc.apiexplorer-10.x branch from ef300fe to 6c6b8e3CompareAugust 9, 2026 21:56
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Update dependency Asp.Versioning.Mvc.ApiExplorer to v10 - #136

Open
renovate[bot] wants to merge 1 commit into
masterfrom
renovate/asp.versioning.mvc.apiexplorer-10.x
Open

Update dependency Asp.Versioning.Mvc.ApiExplorer to v10#136
renovate[bot] wants to merge 1 commit into
masterfrom
renovate/asp.versioning.mvc.apiexplorer-10.x

Conversation

@renovate

@renovaterenovateBot commented Apr 24, 2026

Copy link
Copy Markdown
Contributor

This PR contains the following updates:

PackageChangeAgeAdoptionPassingConfidence
Asp.Versioning.Mvc.ApiExplorer (source)8.1.110.2.1ageadoptionpassingconfidence

Release Notes

dotnet/aspnet-api-versioning (Asp.Versioning.Mvc.ApiExplorer)

v10.2.0: 10.2.0

This release includes some big new features but is fully backward compatible with 10.0.0. The new features include versioned model member filtering, Roslyn analyzers, gRPC preview support, and a number of servicing patches since the previous release.

Fixes

All Platforms

  • Parsing an API version whose status ends in '.' no longer succeeds silently
  • Very large padding values in a format string no longer cause a stack overflow
  • Incorrect lower and upper bounds when matching API version ranges
  • Parsing a positive integer no longer allows whitespace or a leading '-'

ASP.NET Core

  • Routes are no longer incorrectly evicted from the route table (#​1138)
  • Fixed routing of unversioned endpoints
  • Fixed extracting an API version that includes a status when versioning by URL segment (#​1187)
  • A user-registered IProblemDetailsWriter is preserved by AddApiVersioning() (#​1191)

ASP.NET Core OpenAPI

  • Support for more XML comment tags (#​1205)
  • Fixed the error message reported for an unmapped JSON property
  • Fixed descriptions applied to filtered members

Features

All Platforms

  • New ApiVersionRange type for matching a set of API versions using the same interval notation as a package version
    • 1.0x ≥ 1.0
    • [1.0]x == 1.0
    • (1.0,)x > 1.0
    • (,1.0]x ≤ 1.0
    • [1.0,2.0)1.0 ≤ x < 2.0
    • Multiple rules are combined as a logical or; ApiVersionRange.Any and ApiVersionRange.Empty are provided for
      the degenerate cases
    • A range matches API versions; it does not define them. API versions must still be explicitly declared
  • New VisibleInApiVersionAttribute indicates the range of API versions a data member is visible in; for example,
    [VisibleInApiVersion("2.0")]
  • New IAnnotation<TKey, TValue> abstraction for associating out-of-band metadata with a member
  • [StringSyntax] is now applied to API version inputs so the IDE and analyzers understand them; the recognized
    syntaxes are ApiVersion, ApiVersionRange, and ApiVersionFormat

Analyzers

API Versioning now ships Roslyn analyzers. There is no new package to install — the core rules are packed into Asp.Versioning.Abstractions and the API rules are packed into Asp.Versioning.Http, so any application that already references API Versioning picks them up transitively.

There is an initial set of 31 rules. You can find all of the rule information in the new diagnostics wiki topic.

Notes:

  • Every rule has a helpLinkUri that resolves to its documentation page
  • Individual rules can be configured through .editorconfig as usual
  • All analyzers can be turned off with a single MSBuild property:
    <PropertyGroup>
    <EnableApiVersioningAnalyzers>false</EnableApiVersioningAnalyzers>
    </PropertyGroup>
    ExcludeAssets="analyzers" on a PackageReference will not work because the package is also reached through
    the dependencies of other packages and NuGet combines the assets from every path

ASP.NET Web API (Classic) is not currently supported. If there is demand, I will consider the support, but I presume
little new development is happening on the older platform.

ASP.NET Core

Data members can now be versioned independently of the endpoint that returns them. Annotate a property with [VisibleInApiVersion] and the member is omitted from responses for API versions outside the range:

publicclassPerson{publicintId{get;set;}publicstringFirstName{get;set;}[VisibleInApiVersion("2.0")]publicAddress?HomeAddress{get;set;}[VisibleInApiVersion("[1.0,2.0)")]publicstring?LegacyEmail{get;set;}}
  • Works for both Minimal APIs and MVC (Core)
  • Filtering members is currently only support for the JSON media type
  • Filtering applies on the way in as well as the way out, which closes the corresponding over-posting gap
  • AddApiVersioning() now registers IHttpContextAccessor so the requested API version is available during
    serialization
  • [VisibleInApiVersion] is part of the core abstractions and can be used in your model libraries without any
    dependency on ASP.NET

ASP.NET Core API Explorer

  • The API explorer describes only the model members visible in the API version being explored via the new
    VersionedModelMetadata, VersionedModelMetadataProvider, and DelegatingModelMetadata types
  • Only models that are actually explored are filtered for visibility

ASP.NET Core OpenAPI

  • Generated schemas reflect per-version member visibility, so the documented shape of a model matches what the API
    actually returns for that version
  • Significantly expanded XML comment support:
    • <remarks> now takes precedence over <description>
    • <b> and <i> are converted to and retained as Markdown
    • <a href="..."/> is converted to and retained as a hyperlink
    • <paramref name="..."/> is rendered as inline code
    • <list>, <item>, <term>, <description>, <value>, and <example> are supported
    • <inheritdoc/> is resolved for summaries
    • Multi-line code fences from <code> blocks are properly closed

ASP.NET Core with gRPC (Preview)

Two new packages add API Versioning to gRPC services: Asp.Versioning.Grpc and Asp.Versioning.Grpc.ApiExplorer. This is a new set of features that will run in preview to give gRPC service authors a chance to try things out and report any issues or gaps.

The following is a basic example showing all of the parts coming together.

services.AddApiVersioning().AddGrpc().AddGrpcApiExplorer().AddOpenApi();varpeople=app.NewVersionedApi("People");people.MapGrpcService<PeopleService>().HasApiVersion(1.0).HasApiVersion(2.0).HasApiVersion(3.0);
  • Services are versioned with the same conventions used everywhere else — a single implementation can support several
    API versions, or implementations can be split across versions
  • Message fields are annotated with the API versions they belong to using the new asp/api/annotations.proto:
    import"asp/api/annotations.proto";
    messagePerson {
    int32id=1;
    stringfirst_name=2;
    stringlast_name=3;
    Addresshome_address=4 [(asp.api.version) = "2.0"];
    stringphone=5 [(asp.api.version) = "3.0"];
    }
    • The option is repeated, so a field split across disjoint ranges repeats the option
    • A field with no annotation is included in every API version
  • A server interceptor filters fields out of requests and responses — including streaming in both directions — so a
    client on 1.0 can neither see nor post a field that was introduced in 3.0
  • JSON transcoded gRPC services are described by the API explorer and appear in the OpenAPI document with the API
    version route segment and well-known protobuf types mapped to their correct schemas

The gRPC OpenAPI Example demonstrates an end-to-end working solution.

Breaking Changes

All Platforms

  • The analyzers are on by default. They ship inside Asp.Versioning.Abstractions and Asp.Versioning.Http, which
    means upgrading turns them on for every project that references API versioning — directly or transitively. AV0012,
    AV0018, and AV0019 default to error severity, so an existing application that trips one of them will fail to build
    until the underlying problem is fixed, the rule is downgraded in .editorconfig, or
    <EnableApiVersioningAnalyzers>false</EnableApiVersioningAnalyzers> is set. Before these rules existed, an
    application should have either encountered runtime exceptions or not functioned as expected. These rules are catching
    mistakes early rather than imposing specific dogma about how your application must be defined.

ASP.NET Core

  • AddApiVersioning() now calls AddHttpContextAccessor(). This is additive and should be transparent, but it does mean
    IHttpContextAccessor is registered in applications that previously did not have it

Documentation

The wiki has served the community well for many years, but it had gotten tired and it was due for some much needed love and updates. I've reworked the wiki into a new GitHub Pages site using mdBook.

  • The wiki has been ported to GitHub Pages and is now published at dotnet.github.io/aspnet-api-versioning with search, per-page tables of contents, and side-by-side content for each supported flavor of ASP.NET
  • README badges and links throughout the repository now point at the new site
  • The old wiki pages still exist so that old links are not broken
    • All future links should link to the new content

Why change?

  • There was little-to-no control over wiki page names, which makes it difficult for SEO
  • The wiki HTML support is much more limited that GitHub Pages
    • Theming is also supported
  • The wiki was considerable in size, but you couldn't search it; now you can
  • The project started with ASP.NET Web API (Classic) a decade ago, but ASP.NET Core is now the de facto platform
    • ASP.NET Core and Web API (Classic) have been split apart
    • There will be overlap in search, but everything else is cleanly separated
  • Errors and updates. There has never been a good way for the community to create pull requests to update content
  • The content lifecycle was outside of the repository content; now it's side-by-side
    • This helps keep the content current and fresh
  • Printing now has first-class support

It certainly possible that some links or content are incorrect after the migration. Please report any errors or submit a pull request
and they will be fixed promptly.

Release Notes

  • Package release notes are now emitted through the PackageReleaseNotes property instead of being appended to the
    package README (#​1211)
  • Asp.Versioning.OData and Asp.Versioning.OpenAPI are no longer rc; both were promoted to stable during servicing and ship as 10.2.0
  • Asp.Versioning.Grpc and Asp.Versioning.Grpc.ApiExplorer are new in this release and ship at 10.2.0-preview.1 alongside everything else
  • Microsoft.OpenApi was updated to 2.7.5 due to a vulnerability and pinned to below 3.0.0 after a major version
    incompatibility

Feedback

Thanks to everyone who contributed to this release, whether through code, issues, or test driving the changes.

v10.0.0: 10.0.0

The official release for 10.0 is here! In addition to the changes in the preview releases, there are a few additional changes.

Features
All Platforms
  • ApiVersionAttribute, MapToVersionAttribute, and AdvertiseApiVersionsAttribute all now have a constructor which can support the date format without being a string; for example, [ApiVersion(2026, 04, 01)]
ASP.NET Core OpenAPI
  • XmlCommentsTransformer is now resolved via DI, which allows it to be re-registered with a user-defined file path
  • Public types and members are now virtual for developer extensibility
Fixes
ASP.NET Core OpenAPI
  • Fix comparison between entry and calling assembly (#​1175)
  • Ensure keyed services are registered with a lowercase key (#​1176)
  • Fix nested key service resolution (#​1177)
  • Implement IKeyedServiceProvider when injecting ApiVersion (#​1178)
Breaking Changes
ASP.NET Core OpenAPI
  • OpenAPI documents use "enum": ["1.0"] instead of "default": "1.0"
    • This has a similar effect, but removes the free-form input when the value is bounded
    • When optional, the enum value can still be deleted/removed
    • Some UIs, such as Scalar, still provide a way to provide an enumerated value that isn't in the list
Release Notes
Feedback

Thanks to the contributors on this release whether it was code contributions or test driving the previews. Special thanks to @​sander1095 for being a strong advocate and helping to bring even more visibility to the project.


Configuration

📅 Schedule: (UTC)

  • Branch creation
    • At any time (no schedule defined)
  • Automerge
    • At any time (no schedule defined)

🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 Ignore: Close this PR and you won't be reminded about this update again.


  • If you want to rebase/retry this PR, check this box

This PR was generated by Mend Renovate. View the repository job log.

@renovate
renovateBotforce-pushed the renovate/asp.versioning.mvc.apiexplorer-10.x branch from 333d3dd to a9e24e1CompareMay 18, 2026 09:46
@renovate
renovateBotforce-pushed the renovate/asp.versioning.mvc.apiexplorer-10.x branch from a9e24e1 to f5be012CompareJuly 12, 2026 17:47
@renovate
renovateBotforce-pushed the renovate/asp.versioning.mvc.apiexplorer-10.x branch 2 times, most recently from 52df7bd to ef300feCompareAugust 9, 2026 05:27
@renovate
renovateBotforce-pushed the renovate/asp.versioning.mvc.apiexplorer-10.x branch from ef300fe to 6c6b8e3CompareAugust 9, 2026 21:56
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Update dependency Asp.Versioning.Mvc.ApiExplorer to v10 - #136

Open
renovate[bot] wants to merge 1 commit into
masterfrom
renovate/asp.versioning.mvc.apiexplorer-10.x
Open

Update dependency Asp.Versioning.Mvc.ApiExplorer to v10#136
renovate[bot] wants to merge 1 commit into
masterfrom
renovate/asp.versioning.mvc.apiexplorer-10.x

Conversation

@renovate

@renovaterenovateBot commented Apr 24, 2026

Copy link
Copy Markdown
Contributor

This PR contains the following updates:

PackageChangeAgeAdoptionPassingConfidence
Asp.Versioning.Mvc.ApiExplorer (source)8.1.110.2.1ageadoptionpassingconfidence

Release Notes

dotnet/aspnet-api-versioning (Asp.Versioning.Mvc.ApiExplorer)

v10.2.0: 10.2.0

This release includes some big new features but is fully backward compatible with 10.0.0. The new features include versioned model member filtering, Roslyn analyzers, gRPC preview support, and a number of servicing patches since the previous release.

Fixes

All Platforms

  • Parsing an API version whose status ends in '.' no longer succeeds silently
  • Very large padding values in a format string no longer cause a stack overflow
  • Incorrect lower and upper bounds when matching API version ranges
  • Parsing a positive integer no longer allows whitespace or a leading '-'

ASP.NET Core

  • Routes are no longer incorrectly evicted from the route table (#​1138)
  • Fixed routing of unversioned endpoints
  • Fixed extracting an API version that includes a status when versioning by URL segment (#​1187)
  • A user-registered IProblemDetailsWriter is preserved by AddApiVersioning() (#​1191)

ASP.NET Core OpenAPI

  • Support for more XML comment tags (#​1205)
  • Fixed the error message reported for an unmapped JSON property
  • Fixed descriptions applied to filtered members

Features

All Platforms

  • New ApiVersionRange type for matching a set of API versions using the same interval notation as a package version
    • 1.0x ≥ 1.0
    • [1.0]x == 1.0
    • (1.0,)x > 1.0
    • (,1.0]x ≤ 1.0
    • [1.0,2.0)1.0 ≤ x < 2.0
    • Multiple rules are combined as a logical or; ApiVersionRange.Any and ApiVersionRange.Empty are provided for
      the degenerate cases
    • A range matches API versions; it does not define them. API versions must still be explicitly declared
  • New VisibleInApiVersionAttribute indicates the range of API versions a data member is visible in; for example,
    [VisibleInApiVersion("2.0")]
  • New IAnnotation<TKey, TValue> abstraction for associating out-of-band metadata with a member
  • [StringSyntax] is now applied to API version inputs so the IDE and analyzers understand them; the recognized
    syntaxes are ApiVersion, ApiVersionRange, and ApiVersionFormat

Analyzers

API Versioning now ships Roslyn analyzers. There is no new package to install — the core rules are packed into Asp.Versioning.Abstractions and the API rules are packed into Asp.Versioning.Http, so any application that already references API Versioning picks them up transitively.

There is an initial set of 31 rules. You can find all of the rule information in the new diagnostics wiki topic.

Notes:

  • Every rule has a helpLinkUri that resolves to its documentation page
  • Individual rules can be configured through .editorconfig as usual
  • All analyzers can be turned off with a single MSBuild property:
    <PropertyGroup>
    <EnableApiVersioningAnalyzers>false</EnableApiVersioningAnalyzers>
    </PropertyGroup>
    ExcludeAssets="analyzers" on a PackageReference will not work because the package is also reached through
    the dependencies of other packages and NuGet combines the assets from every path

ASP.NET Web API (Classic) is not currently supported. If there is demand, I will consider the support, but I presume
little new development is happening on the older platform.

ASP.NET Core

Data members can now be versioned independently of the endpoint that returns them. Annotate a property with [VisibleInApiVersion] and the member is omitted from responses for API versions outside the range:

publicclassPerson{publicintId{get;set;}publicstringFirstName{get;set;}[VisibleInApiVersion("2.0")]publicAddress?HomeAddress{get;set;}[VisibleInApiVersion("[1.0,2.0)")]publicstring?LegacyEmail{get;set;}}
  • Works for both Minimal APIs and MVC (Core)
  • Filtering members is currently only support for the JSON media type
  • Filtering applies on the way in as well as the way out, which closes the corresponding over-posting gap
  • AddApiVersioning() now registers IHttpContextAccessor so the requested API version is available during
    serialization
  • [VisibleInApiVersion] is part of the core abstractions and can be used in your model libraries without any
    dependency on ASP.NET

ASP.NET Core API Explorer

  • The API explorer describes only the model members visible in the API version being explored via the new
    VersionedModelMetadata, VersionedModelMetadataProvider, and DelegatingModelMetadata types
  • Only models that are actually explored are filtered for visibility

ASP.NET Core OpenAPI

  • Generated schemas reflect per-version member visibility, so the documented shape of a model matches what the API
    actually returns for that version
  • Significantly expanded XML comment support:
    • <remarks> now takes precedence over <description>
    • <b> and <i> are converted to and retained as Markdown
    • <a href="..."/> is converted to and retained as a hyperlink
    • <paramref name="..."/> is rendered as inline code
    • <list>, <item>, <term>, <description>, <value>, and <example> are supported
    • <inheritdoc/> is resolved for summaries
    • Multi-line code fences from <code> blocks are properly closed

ASP.NET Core with gRPC (Preview)

Two new packages add API Versioning to gRPC services: Asp.Versioning.Grpc and Asp.Versioning.Grpc.ApiExplorer. This is a new set of features that will run in preview to give gRPC service authors a chance to try things out and report any issues or gaps.

The following is a basic example showing all of the parts coming together.

services.AddApiVersioning().AddGrpc().AddGrpcApiExplorer().AddOpenApi();varpeople=app.NewVersionedApi("People");people.MapGrpcService<PeopleService>().HasApiVersion(1.0).HasApiVersion(2.0).HasApiVersion(3.0);
  • Services are versioned with the same conventions used everywhere else — a single implementation can support several
    API versions, or implementations can be split across versions
  • Message fields are annotated with the API versions they belong to using the new asp/api/annotations.proto:
    import"asp/api/annotations.proto";
    messagePerson {
    int32id=1;
    stringfirst_name=2;
    stringlast_name=3;
    Addresshome_address=4 [(asp.api.version) = "2.0"];
    stringphone=5 [(asp.api.version) = "3.0"];
    }
    • The option is repeated, so a field split across disjoint ranges repeats the option
    • A field with no annotation is included in every API version
  • A server interceptor filters fields out of requests and responses — including streaming in both directions — so a
    client on 1.0 can neither see nor post a field that was introduced in 3.0
  • JSON transcoded gRPC services are described by the API explorer and appear in the OpenAPI document with the API
    version route segment and well-known protobuf types mapped to their correct schemas

The gRPC OpenAPI Example demonstrates an end-to-end working solution.

Breaking Changes

All Platforms

  • The analyzers are on by default. They ship inside Asp.Versioning.Abstractions and Asp.Versioning.Http, which
    means upgrading turns them on for every project that references API versioning — directly or transitively. AV0012,
    AV0018, and AV0019 default to error severity, so an existing application that trips one of them will fail to build
    until the underlying problem is fixed, the rule is downgraded in .editorconfig, or
    <EnableApiVersioningAnalyzers>false</EnableApiVersioningAnalyzers> is set. Before these rules existed, an
    application should have either encountered runtime exceptions or not functioned as expected. These rules are catching
    mistakes early rather than imposing specific dogma about how your application must be defined.

ASP.NET Core

  • AddApiVersioning() now calls AddHttpContextAccessor(). This is additive and should be transparent, but it does mean
    IHttpContextAccessor is registered in applications that previously did not have it

Documentation

The wiki has served the community well for many years, but it had gotten tired and it was due for some much needed love and updates. I've reworked the wiki into a new GitHub Pages site using mdBook.

  • The wiki has been ported to GitHub Pages and is now published at dotnet.github.io/aspnet-api-versioning with search, per-page tables of contents, and side-by-side content for each supported flavor of ASP.NET
  • README badges and links throughout the repository now point at the new site
  • The old wiki pages still exist so that old links are not broken
    • All future links should link to the new content

Why change?

  • There was little-to-no control over wiki page names, which makes it difficult for SEO
  • The wiki HTML support is much more limited that GitHub Pages
    • Theming is also supported
  • The wiki was considerable in size, but you couldn't search it; now you can
  • The project started with ASP.NET Web API (Classic) a decade ago, but ASP.NET Core is now the de facto platform
    • ASP.NET Core and Web API (Classic) have been split apart
    • There will be overlap in search, but everything else is cleanly separated
  • Errors and updates. There has never been a good way for the community to create pull requests to update content
  • The content lifecycle was outside of the repository content; now it's side-by-side
    • This helps keep the content current and fresh
  • Printing now has first-class support

It certainly possible that some links or content are incorrect after the migration. Please report any errors or submit a pull request
and they will be fixed promptly.

Release Notes

  • Package release notes are now emitted through the PackageReleaseNotes property instead of being appended to the
    package README (#​1211)
  • Asp.Versioning.OData and Asp.Versioning.OpenAPI are no longer rc; both were promoted to stable during servicing and ship as 10.2.0
  • Asp.Versioning.Grpc and Asp.Versioning.Grpc.ApiExplorer are new in this release and ship at 10.2.0-preview.1 alongside everything else
  • Microsoft.OpenApi was updated to 2.7.5 due to a vulnerability and pinned to below 3.0.0 after a major version
    incompatibility

Feedback

Thanks to everyone who contributed to this release, whether through code, issues, or test driving the changes.

v10.0.0: 10.0.0

The official release for 10.0 is here! In addition to the changes in the preview releases, there are a few additional changes.

Features
All Platforms
  • ApiVersionAttribute, MapToVersionAttribute, and AdvertiseApiVersionsAttribute all now have a constructor which can support the date format without being a string; for example, [ApiVersion(2026, 04, 01)]
ASP.NET Core OpenAPI
  • XmlCommentsTransformer is now resolved via DI, which allows it to be re-registered with a user-defined file path
  • Public types and members are now virtual for developer extensibility
Fixes
ASP.NET Core OpenAPI
  • Fix comparison between entry and calling assembly (#​1175)
  • Ensure keyed services are registered with a lowercase key (#​1176)
  • Fix nested key service resolution (#​1177)
  • Implement IKeyedServiceProvider when injecting ApiVersion (#​1178)
Breaking Changes
ASP.NET Core OpenAPI
  • OpenAPI documents use "enum": ["1.0"] instead of "default": "1.0"
    • This has a similar effect, but removes the free-form input when the value is bounded
    • When optional, the enum value can still be deleted/removed
    • Some UIs, such as Scalar, still provide a way to provide an enumerated value that isn't in the list
Release Notes
Feedback

Thanks to the contributors on this release whether it was code contributions or test driving the previews. Special thanks to @​sander1095 for being a strong advocate and helping to bring even more visibility to the project.


Configuration

📅 Schedule: (UTC)

  • Branch creation
    • At any time (no schedule defined)
  • Automerge
    • At any time (no schedule defined)

🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 Ignore: Close this PR and you won't be reminded about this update again.


  • If you want to rebase/retry this PR, check this box

This PR was generated by Mend Renovate. View the repository job log.

@renovate
renovateBotforce-pushed the renovate/asp.versioning.mvc.apiexplorer-10.x branch from 333d3dd to a9e24e1CompareMay 18, 2026 09:46
@renovate
renovateBotforce-pushed the renovate/asp.versioning.mvc.apiexplorer-10.x branch from a9e24e1 to f5be012CompareJuly 12, 2026 17:47
@renovate
renovateBotforce-pushed the renovate/asp.versioning.mvc.apiexplorer-10.x branch 2 times, most recently from 52df7bd to ef300feCompareAugust 9, 2026 05:27
@renovate
renovateBotforce-pushed the renovate/asp.versioning.mvc.apiexplorer-10.x branch from ef300fe to 6c6b8e3CompareAugust 9, 2026 21:56
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Update dependency Asp.Versioning.Mvc.ApiExplorer to v10 - #136

Open
renovate[bot] wants to merge 1 commit into
masterfrom
renovate/asp.versioning.mvc.apiexplorer-10.x
Open

Update dependency Asp.Versioning.Mvc.ApiExplorer to v10#136
renovate[bot] wants to merge 1 commit into
masterfrom
renovate/asp.versioning.mvc.apiexplorer-10.x

Conversation

@renovate

@renovaterenovateBot commented Apr 24, 2026

Copy link
Copy Markdown
Contributor

This PR contains the following updates:

PackageChangeAgeAdoptionPassingConfidence
Asp.Versioning.Mvc.ApiExplorer (source)8.1.110.2.1ageadoptionpassingconfidence

Release Notes

dotnet/aspnet-api-versioning (Asp.Versioning.Mvc.ApiExplorer)

v10.2.0: 10.2.0

This release includes some big new features but is fully backward compatible with 10.0.0. The new features include versioned model member filtering, Roslyn analyzers, gRPC preview support, and a number of servicing patches since the previous release.

Fixes

All Platforms

  • Parsing an API version whose status ends in '.' no longer succeeds silently
  • Very large padding values in a format string no longer cause a stack overflow
  • Incorrect lower and upper bounds when matching API version ranges
  • Parsing a positive integer no longer allows whitespace or a leading '-'

ASP.NET Core

  • Routes are no longer incorrectly evicted from the route table (#​1138)
  • Fixed routing of unversioned endpoints
  • Fixed extracting an API version that includes a status when versioning by URL segment (#​1187)
  • A user-registered IProblemDetailsWriter is preserved by AddApiVersioning() (#​1191)

ASP.NET Core OpenAPI

  • Support for more XML comment tags (#​1205)
  • Fixed the error message reported for an unmapped JSON property
  • Fixed descriptions applied to filtered members

Features

All Platforms

  • New ApiVersionRange type for matching a set of API versions using the same interval notation as a package version
    • 1.0x ≥ 1.0
    • [1.0]x == 1.0
    • (1.0,)x > 1.0
    • (,1.0]x ≤ 1.0
    • [1.0,2.0)1.0 ≤ x < 2.0
    • Multiple rules are combined as a logical or; ApiVersionRange.Any and ApiVersionRange.Empty are provided for
      the degenerate cases
    • A range matches API versions; it does not define them. API versions must still be explicitly declared
  • New VisibleInApiVersionAttribute indicates the range of API versions a data member is visible in; for example,
    [VisibleInApiVersion("2.0")]
  • New IAnnotation<TKey, TValue> abstraction for associating out-of-band metadata with a member
  • [StringSyntax] is now applied to API version inputs so the IDE and analyzers understand them; the recognized
    syntaxes are ApiVersion, ApiVersionRange, and ApiVersionFormat

Analyzers

API Versioning now ships Roslyn analyzers. There is no new package to install — the core rules are packed into Asp.Versioning.Abstractions and the API rules are packed into Asp.Versioning.Http, so any application that already references API Versioning picks them up transitively.

There is an initial set of 31 rules. You can find all of the rule information in the new diagnostics wiki topic.

Notes:

  • Every rule has a helpLinkUri that resolves to its documentation page
  • Individual rules can be configured through .editorconfig as usual
  • All analyzers can be turned off with a single MSBuild property:
    <PropertyGroup>
    <EnableApiVersioningAnalyzers>false</EnableApiVersioningAnalyzers>
    </PropertyGroup>
    ExcludeAssets="analyzers" on a PackageReference will not work because the package is also reached through
    the dependencies of other packages and NuGet combines the assets from every path

ASP.NET Web API (Classic) is not currently supported. If there is demand, I will consider the support, but I presume
little new development is happening on the older platform.

ASP.NET Core

Data members can now be versioned independently of the endpoint that returns them. Annotate a property with [VisibleInApiVersion] and the member is omitted from responses for API versions outside the range:

publicclassPerson{publicintId{get;set;}publicstringFirstName{get;set;}[VisibleInApiVersion("2.0")]publicAddress?HomeAddress{get;set;}[VisibleInApiVersion("[1.0,2.0)")]publicstring?LegacyEmail{get;set;}}
  • Works for both Minimal APIs and MVC (Core)
  • Filtering members is currently only support for the JSON media type
  • Filtering applies on the way in as well as the way out, which closes the corresponding over-posting gap
  • AddApiVersioning() now registers IHttpContextAccessor so the requested API version is available during
    serialization
  • [VisibleInApiVersion] is part of the core abstractions and can be used in your model libraries without any
    dependency on ASP.NET

ASP.NET Core API Explorer

  • The API explorer describes only the model members visible in the API version being explored via the new
    VersionedModelMetadata, VersionedModelMetadataProvider, and DelegatingModelMetadata types
  • Only models that are actually explored are filtered for visibility

ASP.NET Core OpenAPI

  • Generated schemas reflect per-version member visibility, so the documented shape of a model matches what the API
    actually returns for that version
  • Significantly expanded XML comment support:
    • <remarks> now takes precedence over <description>
    • <b> and <i> are converted to and retained as Markdown
    • <a href="..."/> is converted to and retained as a hyperlink
    • <paramref name="..."/> is rendered as inline code
    • <list>, <item>, <term>, <description>, <value>, and <example> are supported
    • <inheritdoc/> is resolved for summaries
    • Multi-line code fences from <code> blocks are properly closed

ASP.NET Core with gRPC (Preview)

Two new packages add API Versioning to gRPC services: Asp.Versioning.Grpc and Asp.Versioning.Grpc.ApiExplorer. This is a new set of features that will run in preview to give gRPC service authors a chance to try things out and report any issues or gaps.

The following is a basic example showing all of the parts coming together.

services.AddApiVersioning().AddGrpc().AddGrpcApiExplorer().AddOpenApi();varpeople=app.NewVersionedApi("People");people.MapGrpcService<PeopleService>().HasApiVersion(1.0).HasApiVersion(2.0).HasApiVersion(3.0);
  • Services are versioned with the same conventions used everywhere else — a single implementation can support several
    API versions, or implementations can be split across versions
  • Message fields are annotated with the API versions they belong to using the new asp/api/annotations.proto:
    import"asp/api/annotations.proto";
    messagePerson {
    int32id=1;
    stringfirst_name=2;
    stringlast_name=3;
    Addresshome_address=4 [(asp.api.version) = "2.0"];
    stringphone=5 [(asp.api.version) = "3.0"];
    }
    • The option is repeated, so a field split across disjoint ranges repeats the option
    • A field with no annotation is included in every API version
  • A server interceptor filters fields out of requests and responses — including streaming in both directions — so a
    client on 1.0 can neither see nor post a field that was introduced in 3.0
  • JSON transcoded gRPC services are described by the API explorer and appear in the OpenAPI document with the API
    version route segment and well-known protobuf types mapped to their correct schemas

The gRPC OpenAPI Example demonstrates an end-to-end working solution.

Breaking Changes

All Platforms

  • The analyzers are on by default. They ship inside Asp.Versioning.Abstractions and Asp.Versioning.Http, which
    means upgrading turns them on for every project that references API versioning — directly or transitively. AV0012,
    AV0018, and AV0019 default to error severity, so an existing application that trips one of them will fail to build
    until the underlying problem is fixed, the rule is downgraded in .editorconfig, or
    <EnableApiVersioningAnalyzers>false</EnableApiVersioningAnalyzers> is set. Before these rules existed, an
    application should have either encountered runtime exceptions or not functioned as expected. These rules are catching
    mistakes early rather than imposing specific dogma about how your application must be defined.

ASP.NET Core

  • AddApiVersioning() now calls AddHttpContextAccessor(). This is additive and should be transparent, but it does mean
    IHttpContextAccessor is registered in applications that previously did not have it

Documentation

The wiki has served the community well for many years, but it had gotten tired and it was due for some much needed love and updates. I've reworked the wiki into a new GitHub Pages site using mdBook.

  • The wiki has been ported to GitHub Pages and is now published at dotnet.github.io/aspnet-api-versioning with search, per-page tables of contents, and side-by-side content for each supported flavor of ASP.NET
  • README badges and links throughout the repository now point at the new site
  • The old wiki pages still exist so that old links are not broken
    • All future links should link to the new content

Why change?

  • There was little-to-no control over wiki page names, which makes it difficult for SEO
  • The wiki HTML support is much more limited that GitHub Pages
    • Theming is also supported
  • The wiki was considerable in size, but you couldn't search it; now you can
  • The project started with ASP.NET Web API (Classic) a decade ago, but ASP.NET Core is now the de facto platform
    • ASP.NET Core and Web API (Classic) have been split apart
    • There will be overlap in search, but everything else is cleanly separated
  • Errors and updates. There has never been a good way for the community to create pull requests to update content
  • The content lifecycle was outside of the repository content; now it's side-by-side
    • This helps keep the content current and fresh
  • Printing now has first-class support

It certainly possible that some links or content are incorrect after the migration. Please report any errors or submit a pull request
and they will be fixed promptly.

Release Notes

  • Package release notes are now emitted through the PackageReleaseNotes property instead of being appended to the
    package README (#​1211)
  • Asp.Versioning.OData and Asp.Versioning.OpenAPI are no longer rc; both were promoted to stable during servicing and ship as 10.2.0
  • Asp.Versioning.Grpc and Asp.Versioning.Grpc.ApiExplorer are new in this release and ship at 10.2.0-preview.1 alongside everything else
  • Microsoft.OpenApi was updated to 2.7.5 due to a vulnerability and pinned to below 3.0.0 after a major version
    incompatibility

Feedback

Thanks to everyone who contributed to this release, whether through code, issues, or test driving the changes.

v10.0.0: 10.0.0

The official release for 10.0 is here! In addition to the changes in the preview releases, there are a few additional changes.

Features
All Platforms
  • ApiVersionAttribute, MapToVersionAttribute, and AdvertiseApiVersionsAttribute all now have a constructor which can support the date format without being a string; for example, [ApiVersion(2026, 04, 01)]
ASP.NET Core OpenAPI
  • XmlCommentsTransformer is now resolved via DI, which allows it to be re-registered with a user-defined file path
  • Public types and members are now virtual for developer extensibility
Fixes
ASP.NET Core OpenAPI
  • Fix comparison between entry and calling assembly (#​1175)
  • Ensure keyed services are registered with a lowercase key (#​1176)
  • Fix nested key service resolution (#​1177)
  • Implement IKeyedServiceProvider when injecting ApiVersion (#​1178)
Breaking Changes
ASP.NET Core OpenAPI
  • OpenAPI documents use "enum": ["1.0"] instead of "default": "1.0"
    • This has a similar effect, but removes the free-form input when the value is bounded
    • When optional, the enum value can still be deleted/removed
    • Some UIs, such as Scalar, still provide a way to provide an enumerated value that isn't in the list
Release Notes
Feedback

Thanks to the contributors on this release whether it was code contributions or test driving the previews. Special thanks to @​sander1095 for being a strong advocate and helping to bring even more visibility to the project.


Configuration

📅 Schedule: (UTC)

  • Branch creation
    • At any time (no schedule defined)
  • Automerge
    • At any time (no schedule defined)

🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 Ignore: Close this PR and you won't be reminded about this update again.


  • If you want to rebase/retry this PR, check this box

This PR was generated by Mend Renovate. View the repository job log.

@renovate
renovateBotforce-pushed the renovate/asp.versioning.mvc.apiexplorer-10.x branch from 333d3dd to a9e24e1CompareMay 18, 2026 09:46
@renovate
renovateBotforce-pushed the renovate/asp.versioning.mvc.apiexplorer-10.x branch from a9e24e1 to f5be012CompareJuly 12, 2026 17:47
@renovate
renovateBotforce-pushed the renovate/asp.versioning.mvc.apiexplorer-10.x branch 2 times, most recently from 52df7bd to ef300feCompareAugust 9, 2026 05:27
@renovate
renovateBotforce-pushed the renovate/asp.versioning.mvc.apiexplorer-10.x branch from ef300fe to 6c6b8e3CompareAugust 9, 2026 21:56
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Update dependency Asp.Versioning.Mvc.ApiExplorer to v10 - #136

Open
renovate[bot] wants to merge 1 commit into
masterfrom
renovate/asp.versioning.mvc.apiexplorer-10.x
Open

Update dependency Asp.Versioning.Mvc.ApiExplorer to v10#136
renovate[bot] wants to merge 1 commit into
masterfrom
renovate/asp.versioning.mvc.apiexplorer-10.x

Conversation

@renovate

@renovaterenovateBot commented Apr 24, 2026

Copy link
Copy Markdown
Contributor

This PR contains the following updates:

PackageChangeAgeAdoptionPassingConfidence
Asp.Versioning.Mvc.ApiExplorer (source)8.1.110.2.1ageadoptionpassingconfidence

Release Notes

dotnet/aspnet-api-versioning (Asp.Versioning.Mvc.ApiExplorer)

v10.2.0: 10.2.0

This release includes some big new features but is fully backward compatible with 10.0.0. The new features include versioned model member filtering, Roslyn analyzers, gRPC preview support, and a number of servicing patches since the previous release.

Fixes

All Platforms

  • Parsing an API version whose status ends in '.' no longer succeeds silently
  • Very large padding values in a format string no longer cause a stack overflow
  • Incorrect lower and upper bounds when matching API version ranges
  • Parsing a positive integer no longer allows whitespace or a leading '-'

ASP.NET Core

  • Routes are no longer incorrectly evicted from the route table (#​1138)
  • Fixed routing of unversioned endpoints
  • Fixed extracting an API version that includes a status when versioning by URL segment (#​1187)
  • A user-registered IProblemDetailsWriter is preserved by AddApiVersioning() (#​1191)

ASP.NET Core OpenAPI

  • Support for more XML comment tags (#​1205)
  • Fixed the error message reported for an unmapped JSON property
  • Fixed descriptions applied to filtered members

Features

All Platforms

  • New ApiVersionRange type for matching a set of API versions using the same interval notation as a package version
    • 1.0x ≥ 1.0
    • [1.0]x == 1.0
    • (1.0,)x > 1.0
    • (,1.0]x ≤ 1.0
    • [1.0,2.0)1.0 ≤ x < 2.0
    • Multiple rules are combined as a logical or; ApiVersionRange.Any and ApiVersionRange.Empty are provided for
      the degenerate cases
    • A range matches API versions; it does not define them. API versions must still be explicitly declared
  • New VisibleInApiVersionAttribute indicates the range of API versions a data member is visible in; for example,
    [VisibleInApiVersion("2.0")]
  • New IAnnotation<TKey, TValue> abstraction for associating out-of-band metadata with a member
  • [StringSyntax] is now applied to API version inputs so the IDE and analyzers understand them; the recognized
    syntaxes are ApiVersion, ApiVersionRange, and ApiVersionFormat

Analyzers

API Versioning now ships Roslyn analyzers. There is no new package to install — the core rules are packed into Asp.Versioning.Abstractions and the API rules are packed into Asp.Versioning.Http, so any application that already references API Versioning picks them up transitively.

There is an initial set of 31 rules. You can find all of the rule information in the new diagnostics wiki topic.

Notes:

  • Every rule has a helpLinkUri that resolves to its documentation page
  • Individual rules can be configured through .editorconfig as usual
  • All analyzers can be turned off with a single MSBuild property:
    <PropertyGroup>
    <EnableApiVersioningAnalyzers>false</EnableApiVersioningAnalyzers>
    </PropertyGroup>
    ExcludeAssets="analyzers" on a PackageReference will not work because the package is also reached through
    the dependencies of other packages and NuGet combines the assets from every path

ASP.NET Web API (Classic) is not currently supported. If there is demand, I will consider the support, but I presume
little new development is happening on the older platform.

ASP.NET Core

Data members can now be versioned independently of the endpoint that returns them. Annotate a property with [VisibleInApiVersion] and the member is omitted from responses for API versions outside the range:

publicclassPerson{publicintId{get;set;}publicstringFirstName{get;set;}[VisibleInApiVersion("2.0")]publicAddress?HomeAddress{get;set;}[VisibleInApiVersion("[1.0,2.0)")]publicstring?LegacyEmail{get;set;}}
  • Works for both Minimal APIs and MVC (Core)
  • Filtering members is currently only support for the JSON media type
  • Filtering applies on the way in as well as the way out, which closes the corresponding over-posting gap
  • AddApiVersioning() now registers IHttpContextAccessor so the requested API version is available during
    serialization
  • [VisibleInApiVersion] is part of the core abstractions and can be used in your model libraries without any
    dependency on ASP.NET

ASP.NET Core API Explorer

  • The API explorer describes only the model members visible in the API version being explored via the new
    VersionedModelMetadata, VersionedModelMetadataProvider, and DelegatingModelMetadata types
  • Only models that are actually explored are filtered for visibility

ASP.NET Core OpenAPI

  • Generated schemas reflect per-version member visibility, so the documented shape of a model matches what the API
    actually returns for that version
  • Significantly expanded XML comment support:
    • <remarks> now takes precedence over <description>
    • <b> and <i> are converted to and retained as Markdown
    • <a href="..."/> is converted to and retained as a hyperlink
    • <paramref name="..."/> is rendered as inline code
    • <list>, <item>, <term>, <description>, <value>, and <example> are supported
    • <inheritdoc/> is resolved for summaries
    • Multi-line code fences from <code> blocks are properly closed

ASP.NET Core with gRPC (Preview)

Two new packages add API Versioning to gRPC services: Asp.Versioning.Grpc and Asp.Versioning.Grpc.ApiExplorer. This is a new set of features that will run in preview to give gRPC service authors a chance to try things out and report any issues or gaps.

The following is a basic example showing all of the parts coming together.

services.AddApiVersioning().AddGrpc().AddGrpcApiExplorer().AddOpenApi();varpeople=app.NewVersionedApi("People");people.MapGrpcService<PeopleService>().HasApiVersion(1.0).HasApiVersion(2.0).HasApiVersion(3.0);
  • Services are versioned with the same conventions used everywhere else — a single implementation can support several
    API versions, or implementations can be split across versions
  • Message fields are annotated with the API versions they belong to using the new asp/api/annotations.proto:
    import"asp/api/annotations.proto";
    messagePerson {
    int32id=1;
    stringfirst_name=2;
    stringlast_name=3;
    Addresshome_address=4 [(asp.api.version) = "2.0"];
    stringphone=5 [(asp.api.version) = "3.0"];
    }
    • The option is repeated, so a field split across disjoint ranges repeats the option
    • A field with no annotation is included in every API version
  • A server interceptor filters fields out of requests and responses — including streaming in both directions — so a
    client on 1.0 can neither see nor post a field that was introduced in 3.0
  • JSON transcoded gRPC services are described by the API explorer and appear in the OpenAPI document with the API
    version route segment and well-known protobuf types mapped to their correct schemas

The gRPC OpenAPI Example demonstrates an end-to-end working solution.

Breaking Changes

All Platforms

  • The analyzers are on by default. They ship inside Asp.Versioning.Abstractions and Asp.Versioning.Http, which
    means upgrading turns them on for every project that references API versioning — directly or transitively. AV0012,
    AV0018, and AV0019 default to error severity, so an existing application that trips one of them will fail to build
    until the underlying problem is fixed, the rule is downgraded in .editorconfig, or
    <EnableApiVersioningAnalyzers>false</EnableApiVersioningAnalyzers> is set. Before these rules existed, an
    application should have either encountered runtime exceptions or not functioned as expected. These rules are catching
    mistakes early rather than imposing specific dogma about how your application must be defined.

ASP.NET Core

  • AddApiVersioning() now calls AddHttpContextAccessor(). This is additive and should be transparent, but it does mean
    IHttpContextAccessor is registered in applications that previously did not have it

Documentation

The wiki has served the community well for many years, but it had gotten tired and it was due for some much needed love and updates. I've reworked the wiki into a new GitHub Pages site using mdBook.

  • The wiki has been ported to GitHub Pages and is now published at dotnet.github.io/aspnet-api-versioning with search, per-page tables of contents, and side-by-side content for each supported flavor of ASP.NET
  • README badges and links throughout the repository now point at the new site
  • The old wiki pages still exist so that old links are not broken
    • All future links should link to the new content

Why change?

  • There was little-to-no control over wiki page names, which makes it difficult for SEO
  • The wiki HTML support is much more limited that GitHub Pages
    • Theming is also supported
  • The wiki was considerable in size, but you couldn't search it; now you can
  • The project started with ASP.NET Web API (Classic) a decade ago, but ASP.NET Core is now the de facto platform
    • ASP.NET Core and Web API (Classic) have been split apart
    • There will be overlap in search, but everything else is cleanly separated
  • Errors and updates. There has never been a good way for the community to create pull requests to update content
  • The content lifecycle was outside of the repository content; now it's side-by-side
    • This helps keep the content current and fresh
  • Printing now has first-class support

It certainly possible that some links or content are incorrect after the migration. Please report any errors or submit a pull request
and they will be fixed promptly.

Release Notes

  • Package release notes are now emitted through the PackageReleaseNotes property instead of being appended to the
    package README (#​1211)
  • Asp.Versioning.OData and Asp.Versioning.OpenAPI are no longer rc; both were promoted to stable during servicing and ship as 10.2.0
  • Asp.Versioning.Grpc and Asp.Versioning.Grpc.ApiExplorer are new in this release and ship at 10.2.0-preview.1 alongside everything else
  • Microsoft.OpenApi was updated to 2.7.5 due to a vulnerability and pinned to below 3.0.0 after a major version
    incompatibility

Feedback

Thanks to everyone who contributed to this release, whether through code, issues, or test driving the changes.

v10.0.0: 10.0.0

The official release for 10.0 is here! In addition to the changes in the preview releases, there are a few additional changes.

Features
All Platforms
  • ApiVersionAttribute, MapToVersionAttribute, and AdvertiseApiVersionsAttribute all now have a constructor which can support the date format without being a string; for example, [ApiVersion(2026, 04, 01)]
ASP.NET Core OpenAPI
  • XmlCommentsTransformer is now resolved via DI, which allows it to be re-registered with a user-defined file path
  • Public types and members are now virtual for developer extensibility
Fixes
ASP.NET Core OpenAPI
  • Fix comparison between entry and calling assembly (#​1175)
  • Ensure keyed services are registered with a lowercase key (#​1176)
  • Fix nested key service resolution (#​1177)
  • Implement IKeyedServiceProvider when injecting ApiVersion (#​1178)
Breaking Changes
ASP.NET Core OpenAPI
  • OpenAPI documents use "enum": ["1.0"] instead of "default": "1.0"
    • This has a similar effect, but removes the free-form input when the value is bounded
    • When optional, the enum value can still be deleted/removed
    • Some UIs, such as Scalar, still provide a way to provide an enumerated value that isn't in the list
Release Notes
Feedback

Thanks to the contributors on this release whether it was code contributions or test driving the previews. Special thanks to @​sander1095 for being a strong advocate and helping to bring even more visibility to the project.


Configuration

📅 Schedule: (UTC)

  • Branch creation
    • At any time (no schedule defined)
  • Automerge
    • At any time (no schedule defined)

🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 Ignore: Close this PR and you won't be reminded about this update again.


  • If you want to rebase/retry this PR, check this box

This PR was generated by Mend Renovate. View the repository job log.

@renovate
renovateBotforce-pushed the renovate/asp.versioning.mvc.apiexplorer-10.x branch from 333d3dd to a9e24e1CompareMay 18, 2026 09:46
@renovate
renovateBotforce-pushed the renovate/asp.versioning.mvc.apiexplorer-10.x branch from a9e24e1 to f5be012CompareJuly 12, 2026 17:47
@renovate
renovateBotforce-pushed the renovate/asp.versioning.mvc.apiexplorer-10.x branch 2 times, most recently from 52df7bd to ef300feCompareAugust 9, 2026 05:27
@renovate
renovateBotforce-pushed the renovate/asp.versioning.mvc.apiexplorer-10.x branch from ef300fe to 6c6b8e3CompareAugust 9, 2026 21:56
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Update dependency Asp.Versioning.Mvc.ApiExplorer to v10 - #136

Open
renovate[bot] wants to merge 1 commit into
masterfrom
renovate/asp.versioning.mvc.apiexplorer-10.x
Open

Update dependency Asp.Versioning.Mvc.ApiExplorer to v10#136
renovate[bot] wants to merge 1 commit into
masterfrom
renovate/asp.versioning.mvc.apiexplorer-10.x

Conversation

@renovate

@renovaterenovateBot commented Apr 24, 2026

Copy link
Copy Markdown
Contributor

This PR contains the following updates:

PackageChangeAgeAdoptionPassingConfidence
Asp.Versioning.Mvc.ApiExplorer (source)8.1.110.2.1ageadoptionpassingconfidence

Release Notes

dotnet/aspnet-api-versioning (Asp.Versioning.Mvc.ApiExplorer)

v10.2.0: 10.2.0

This release includes some big new features but is fully backward compatible with 10.0.0. The new features include versioned model member filtering, Roslyn analyzers, gRPC preview support, and a number of servicing patches since the previous release.

Fixes

All Platforms

  • Parsing an API version whose status ends in '.' no longer succeeds silently
  • Very large padding values in a format string no longer cause a stack overflow
  • Incorrect lower and upper bounds when matching API version ranges
  • Parsing a positive integer no longer allows whitespace or a leading '-'

ASP.NET Core

  • Routes are no longer incorrectly evicted from the route table (#​1138)
  • Fixed routing of unversioned endpoints
  • Fixed extracting an API version that includes a status when versioning by URL segment (#​1187)
  • A user-registered IProblemDetailsWriter is preserved by AddApiVersioning() (#​1191)

ASP.NET Core OpenAPI

  • Support for more XML comment tags (#​1205)
  • Fixed the error message reported for an unmapped JSON property
  • Fixed descriptions applied to filtered members

Features

All Platforms

  • New ApiVersionRange type for matching a set of API versions using the same interval notation as a package version
    • 1.0x ≥ 1.0
    • [1.0]x == 1.0
    • (1.0,)x > 1.0
    • (,1.0]x ≤ 1.0
    • [1.0,2.0)1.0 ≤ x < 2.0
    • Multiple rules are combined as a logical or; ApiVersionRange.Any and ApiVersionRange.Empty are provided for
      the degenerate cases
    • A range matches API versions; it does not define them. API versions must still be explicitly declared
  • New VisibleInApiVersionAttribute indicates the range of API versions a data member is visible in; for example,
    [VisibleInApiVersion("2.0")]
  • New IAnnotation<TKey, TValue> abstraction for associating out-of-band metadata with a member
  • [StringSyntax] is now applied to API version inputs so the IDE and analyzers understand them; the recognized
    syntaxes are ApiVersion, ApiVersionRange, and ApiVersionFormat

Analyzers

API Versioning now ships Roslyn analyzers. There is no new package to install — the core rules are packed into Asp.Versioning.Abstractions and the API rules are packed into Asp.Versioning.Http, so any application that already references API Versioning picks them up transitively.

There is an initial set of 31 rules. You can find all of the rule information in the new diagnostics wiki topic.

Notes:

  • Every rule has a helpLinkUri that resolves to its documentation page
  • Individual rules can be configured through .editorconfig as usual
  • All analyzers can be turned off with a single MSBuild property:
    <PropertyGroup>
    <EnableApiVersioningAnalyzers>false</EnableApiVersioningAnalyzers>
    </PropertyGroup>
    ExcludeAssets="analyzers" on a PackageReference will not work because the package is also reached through
    the dependencies of other packages and NuGet combines the assets from every path

ASP.NET Web API (Classic) is not currently supported. If there is demand, I will consider the support, but I presume
little new development is happening on the older platform.

ASP.NET Core

Data members can now be versioned independently of the endpoint that returns them. Annotate a property with [VisibleInApiVersion] and the member is omitted from responses for API versions outside the range:

publicclassPerson{publicintId{get;set;}publicstringFirstName{get;set;}[VisibleInApiVersion("2.0")]publicAddress?HomeAddress{get;set;}[VisibleInApiVersion("[1.0,2.0)")]publicstring?LegacyEmail{get;set;}}
  • Works for both Minimal APIs and MVC (Core)
  • Filtering members is currently only support for the JSON media type
  • Filtering applies on the way in as well as the way out, which closes the corresponding over-posting gap
  • AddApiVersioning() now registers IHttpContextAccessor so the requested API version is available during
    serialization
  • [VisibleInApiVersion] is part of the core abstractions and can be used in your model libraries without any
    dependency on ASP.NET

ASP.NET Core API Explorer

  • The API explorer describes only the model members visible in the API version being explored via the new
    VersionedModelMetadata, VersionedModelMetadataProvider, and DelegatingModelMetadata types
  • Only models that are actually explored are filtered for visibility

ASP.NET Core OpenAPI

  • Generated schemas reflect per-version member visibility, so the documented shape of a model matches what the API
    actually returns for that version
  • Significantly expanded XML comment support:
    • <remarks> now takes precedence over <description>
    • <b> and <i> are converted to and retained as Markdown
    • <a href="..."/> is converted to and retained as a hyperlink
    • <paramref name="..."/> is rendered as inline code
    • <list>, <item>, <term>, <description>, <value>, and <example> are supported
    • <inheritdoc/> is resolved for summaries
    • Multi-line code fences from <code> blocks are properly closed

ASP.NET Core with gRPC (Preview)

Two new packages add API Versioning to gRPC services: Asp.Versioning.Grpc and Asp.Versioning.Grpc.ApiExplorer. This is a new set of features that will run in preview to give gRPC service authors a chance to try things out and report any issues or gaps.

The following is a basic example showing all of the parts coming together.

services.AddApiVersioning().AddGrpc().AddGrpcApiExplorer().AddOpenApi();varpeople=app.NewVersionedApi("People");people.MapGrpcService<PeopleService>().HasApiVersion(1.0).HasApiVersion(2.0).HasApiVersion(3.0);
  • Services are versioned with the same conventions used everywhere else — a single implementation can support several
    API versions, or implementations can be split across versions
  • Message fields are annotated with the API versions they belong to using the new asp/api/annotations.proto:
    import"asp/api/annotations.proto";
    messagePerson {
    int32id=1;
    stringfirst_name=2;
    stringlast_name=3;
    Addresshome_address=4 [(asp.api.version) = "2.0"];
    stringphone=5 [(asp.api.version) = "3.0"];
    }
    • The option is repeated, so a field split across disjoint ranges repeats the option
    • A field with no annotation is included in every API version
  • A server interceptor filters fields out of requests and responses — including streaming in both directions — so a
    client on 1.0 can neither see nor post a field that was introduced in 3.0
  • JSON transcoded gRPC services are described by the API explorer and appear in the OpenAPI document with the API
    version route segment and well-known protobuf types mapped to their correct schemas

The gRPC OpenAPI Example demonstrates an end-to-end working solution.

Breaking Changes

All Platforms

  • The analyzers are on by default. They ship inside Asp.Versioning.Abstractions and Asp.Versioning.Http, which
    means upgrading turns them on for every project that references API versioning — directly or transitively. AV0012,
    AV0018, and AV0019 default to error severity, so an existing application that trips one of them will fail to build
    until the underlying problem is fixed, the rule is downgraded in .editorconfig, or
    <EnableApiVersioningAnalyzers>false</EnableApiVersioningAnalyzers> is set. Before these rules existed, an
    application should have either encountered runtime exceptions or not functioned as expected. These rules are catching
    mistakes early rather than imposing specific dogma about how your application must be defined.

ASP.NET Core

  • AddApiVersioning() now calls AddHttpContextAccessor(). This is additive and should be transparent, but it does mean
    IHttpContextAccessor is registered in applications that previously did not have it

Documentation

The wiki has served the community well for many years, but it had gotten tired and it was due for some much needed love and updates. I've reworked the wiki into a new GitHub Pages site using mdBook.

  • The wiki has been ported to GitHub Pages and is now published at dotnet.github.io/aspnet-api-versioning with search, per-page tables of contents, and side-by-side content for each supported flavor of ASP.NET
  • README badges and links throughout the repository now point at the new site
  • The old wiki pages still exist so that old links are not broken
    • All future links should link to the new content

Why change?

  • There was little-to-no control over wiki page names, which makes it difficult for SEO
  • The wiki HTML support is much more limited that GitHub Pages
    • Theming is also supported
  • The wiki was considerable in size, but you couldn't search it; now you can
  • The project started with ASP.NET Web API (Classic) a decade ago, but ASP.NET Core is now the de facto platform
    • ASP.NET Core and Web API (Classic) have been split apart
    • There will be overlap in search, but everything else is cleanly separated
  • Errors and updates. There has never been a good way for the community to create pull requests to update content
  • The content lifecycle was outside of the repository content; now it's side-by-side
    • This helps keep the content current and fresh
  • Printing now has first-class support

It certainly possible that some links or content are incorrect after the migration. Please report any errors or submit a pull request
and they will be fixed promptly.

Release Notes

  • Package release notes are now emitted through the PackageReleaseNotes property instead of being appended to the
    package README (#​1211)
  • Asp.Versioning.OData and Asp.Versioning.OpenAPI are no longer rc; both were promoted to stable during servicing and ship as 10.2.0
  • Asp.Versioning.Grpc and Asp.Versioning.Grpc.ApiExplorer are new in this release and ship at 10.2.0-preview.1 alongside everything else
  • Microsoft.OpenApi was updated to 2.7.5 due to a vulnerability and pinned to below 3.0.0 after a major version
    incompatibility

Feedback

Thanks to everyone who contributed to this release, whether through code, issues, or test driving the changes.

v10.0.0: 10.0.0

The official release for 10.0 is here! In addition to the changes in the preview releases, there are a few additional changes.

Features
All Platforms
  • ApiVersionAttribute, MapToVersionAttribute, and AdvertiseApiVersionsAttribute all now have a constructor which can support the date format without being a string; for example, [ApiVersion(2026, 04, 01)]
ASP.NET Core OpenAPI
  • XmlCommentsTransformer is now resolved via DI, which allows it to be re-registered with a user-defined file path
  • Public types and members are now virtual for developer extensibility
Fixes
ASP.NET Core OpenAPI
  • Fix comparison between entry and calling assembly (#​1175)
  • Ensure keyed services are registered with a lowercase key (#​1176)
  • Fix nested key service resolution (#​1177)
  • Implement IKeyedServiceProvider when injecting ApiVersion (#​1178)
Breaking Changes
ASP.NET Core OpenAPI
  • OpenAPI documents use "enum": ["1.0"] instead of "default": "1.0"
    • This has a similar effect, but removes the free-form input when the value is bounded
    • When optional, the enum value can still be deleted/removed
    • Some UIs, such as Scalar, still provide a way to provide an enumerated value that isn't in the list
Release Notes
Feedback

Thanks to the contributors on this release whether it was code contributions or test driving the previews. Special thanks to @​sander1095 for being a strong advocate and helping to bring even more visibility to the project.


Configuration

📅 Schedule: (UTC)

  • Branch creation
    • At any time (no schedule defined)
  • Automerge
    • At any time (no schedule defined)

🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 Ignore: Close this PR and you won't be reminded about this update again.


  • If you want to rebase/retry this PR, check this box

This PR was generated by Mend Renovate. View the repository job log.

@renovate
renovateBotforce-pushed the renovate/asp.versioning.mvc.apiexplorer-10.x branch from 333d3dd to a9e24e1CompareMay 18, 2026 09:46
@renovate
renovateBotforce-pushed the renovate/asp.versioning.mvc.apiexplorer-10.x branch from a9e24e1 to f5be012CompareJuly 12, 2026 17:47
@renovate
renovateBotforce-pushed the renovate/asp.versioning.mvc.apiexplorer-10.x branch 2 times, most recently from 52df7bd to ef300feCompareAugust 9, 2026 05:27
@renovate
renovateBotforce-pushed the renovate/asp.versioning.mvc.apiexplorer-10.x branch from ef300fe to 6c6b8e3CompareAugust 9, 2026 21:56
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants