Microsoft.AspNetCore.HeaderParsing
8.9.0
Prefix Reserved
See the version list below for details.
dotnet add package Microsoft.AspNetCore.HeaderParsing --version 8.9.0
NuGet\Install-Package Microsoft.AspNetCore.HeaderParsing -Version 8.9.0
<PackageReference Include="Microsoft.AspNetCore.HeaderParsing" Version="8.9.0" />
paket add Microsoft.AspNetCore.HeaderParsing --version 8.9.0
#r "nuget: Microsoft.AspNetCore.HeaderParsing, 8.9.0"
// Install Microsoft.AspNetCore.HeaderParsing as a Cake Addin #addin nuget:?package=Microsoft.AspNetCore.HeaderParsing&version=8.9.0 // Install Microsoft.AspNetCore.HeaderParsing as a Cake Tool #tool nuget:?package=Microsoft.AspNetCore.HeaderParsing&version=8.9.0
Microsoft.AspNetCore.HeaderParsing
This package provides services for strongly typed header parsing and value caching.
In particular:
- There are many different headers with subtle format differences that are hard to parse correctly in all cases. This package provides predefined parsers for commonly used headers.
- Your application may parse the same header value multiple times per request. These APIs automatically cache the parsed values of these headers to make your application faster.
- This package also provides logging and metering of bad header values.
Install the package
From the command-line:
dotnet add package Microsoft.AspNetCore.HeaderParsing
Or directly in the C# project file:
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.HeaderParsing" Version="[CURRENTVERSION]" />
</ItemGroup>
Usage Example
Registering the services
The services can be registered using one of the AddHeaderParsing
overloads:
public static IServiceCollection AddHeaderParsing(this IServiceCollection services)
public static IServiceCollection AddHeaderParsing(this IServiceCollection services, Action<HeaderParsingOptions> configure)
public static IServiceCollection AddHeaderParsing(this IServiceCollection services, IConfigurationSection section)
For example:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddHeaderParsing();
var app = builder.Build();
Registering the parsers
For each header that you want to parse, you need to register an instance of a HeaderSetup
class which will define how a named parser should be parsed, and if the resulting strongly-typed values should be cached in memory.
[!NOTE] Instances of
HeaderSetup
for the most common headers are available in theCommonHeaders
class.
[!IMPORTANT] Instances of
HeaderSetup
should be reused during the application lifetime. It is recommended to keep their reference in objects registered as singletons.
var headerRegistry = app.Services.GetRequiredService<IHeaderRegistry>();
var encodingKey = headerRegistry.Register(CommonHeaders.AcceptEncoding);
Using the parsers
The following example parses the Accept-Encoding
request header to return a list of values:
app.MapGet("/", string (HttpContext context) =>
{
if (context.Request.TryGetHeaderValue(encodingKey, out var encoding))
{
return string.Join(", ", encoding);
}
return "";
});
List of available common parsers
The CommonHeaders
class contains the following reusable header parsers:
- Host
- Accept
- AcceptEncoding
- AcceptLanguage
- CacheControl
- ContentDisposition
- ContentType
- Cookie
- Date
- IfMatch
- IfModifiedSince
- IfNoneMatch
- IfRange
- IfUnmodifiedSince
- Range
- Referer
- XForwardedFor (
X-Forwarded-For
)
Options
The HeaderParsingOptions
class is used to configure common behaviors for this feature.
- You can pre-configure default values to be returned when the current HTTP request contains headers for which you have not configured parsing. See the
DefaultValues
option. - You can change the number of cached values using the
MaxCachedValuesPerHeader
option. If not configured theDefaultMaxCachedValuesPerHeader
value will be used.
Metrics
The package generates the following metrics:
Metric name | Metric value | Dimension | Dimension value |
---|---|---|---|
HeaderParsing.ParsingErrors |
Increased by 1 with every parsing error | HeaderName |
Header name |
Kind |
Error message returned by the TryParse() method |
||
HeaderParsing.CacheAccess |
Increased by 1 with every cache hit or miss | HeaderName |
Header name |
Type |
Either Hit or Miss for the internal header cache hits and misses respectively |
Custom headers parsing
Although this package provides support for parsing many HTTP headers, you sometimes need to parse custom headers.
You can easily extend the header parsing model to support your custom headers by implementing the abstract class HeaderParser
and then register an
instance of this class in the IHeaderRegistry
interface.
Feedback & Contributing
We welcome feedback and contributions in our GitHub repo.
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net6.0 is compatible. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
-
net6.0
- Microsoft.Extensions.Diagnostics (>= 8.0.0)
- Microsoft.Extensions.ObjectPool.DependencyInjection (>= 8.9.0)
- Microsoft.Extensions.Telemetry.Abstractions (>= 8.9.0)
-
net8.0
- Microsoft.Extensions.Diagnostics (>= 8.0.0)
- Microsoft.Extensions.ObjectPool.DependencyInjection (>= 8.9.0)
- Microsoft.Extensions.Telemetry.Abstractions (>= 8.9.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last updated |
---|---|---|
9.0.0 | 137 | 11/12/2024 |
9.0.0-preview.9.24507.7 | 85 | 10/8/2024 |
9.0.0-preview.8.24460.1 | 55 | 9/10/2024 |
9.0.0-preview.7.24412.10 | 73 | 8/14/2024 |
9.0.0-preview.6.24353.1 | 56 | 7/10/2024 |
9.0.0-preview.5.24311.7 | 64 | 6/11/2024 |
9.0.0-preview.4.24271.2 | 77 | 5/21/2024 |
9.0.0-preview.3.24209.3 | 91 | 4/11/2024 |
9.0.0-preview.2.24157.4 | 64 | 3/12/2024 |
9.0.0-preview.1.24108.1 | 75 | 2/13/2024 |
8.10.0 | 229 | 10/8/2024 |
8.9.1 | 199 | 9/6/2024 |
8.9.0 | 115 | 9/5/2024 |
8.8.0 | 170 | 8/13/2024 |
8.7.0 | 141 | 7/10/2024 |
8.6.0 | 166 | 6/11/2024 |
8.5.0 | 230 | 5/14/2024 |
8.4.0 | 247 | 4/9/2024 |
8.3.0 | 206 | 3/12/2024 |
8.2.0 | 216 | 2/13/2024 |
8.1.0 | 860 | 1/9/2024 |
8.0.0 | 434 | 11/14/2023 |
8.0.0-rc.2.23510.2 | 93 | 10/10/2023 |
8.0.0-rc.1.23453.1 | 120 | 9/12/2023 |
8.0.0-preview.7.23407.5 | 110 | 8/8/2023 |
8.0.0-preview.6.23360.2 | 96 | 7/12/2023 |
8.0.0-preview.5.23308.3 | 92 | 6/14/2023 |
8.0.0-preview.4.23273.7 | 87 | 5/23/2023 |