Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 21 additions & 19 deletions aspnetcore/diagnostics/asp0028.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,17 @@ uid: diagnostics/asp0028

## Cause

On the server machine that supports IPv6, listening to `Any`, rather than `IPv6Any` will either not work or be slower than necessary, because of the [underlying System types implementation](https://github.com/dotnet/runtime/issues/82404).
`IPv6Any` is preferred to `Any` because `Any` is slower than `IPv6Any`. In some cases, `Any` may not work at all. `Any` has performance problems due to the [underlying System types implementation](https://github.com/dotnet/runtime/issues/82404).

At the moment of current article publishing, in case of HTTP/1.x or HTTP/2.0 a name like `localhost` will resolve to `[::1]`, which won't be accepted by the server, forcing a retry with `127.0.0.1` (i.e. failed attempt before each connection).
`127.0.0.1` is the IPv4 loopback address. `::1` is the IPv6 loopback address. `Any` is the wildcard address for IPv4. `IPv6Any` is the wildcard address for IPv6.

Currently, when using HTTP/1.x or HTTP/2.0:

* `localhost` resolve to `[::1]`.
* `[::1]` isn't accepted by the server, which forces a retry using `127.0.0.1`, and the cycle continues.

Using `Any` with the preceding conditions is reported with a diagnostic message:

This usage will be reported with a diagnostic message:
```csharp
.UseKestrel().ConfigureKestrel(options =>
{
Expand All @@ -31,36 +37,32 @@ This usage will be reported with a diagnostic message:

## Rule description

The recommended way is to setup Kestrel to listen on `IPv6Any`.
The recommended way to configure Kestrel to listen for incoming connections on all available `IPv6` network interfaces is with `IPv6Any`.

## How to fix violations

For the reported code
```csharp
.UseKestrel().ConfigureKestrel(options =>
{
options.Listen(IPAddress.Any, ...);
})
```
For the problematic code, replace `Any` with `IPv6Any`:

One can either explicitly change usage to `IPv6Any`:
```csharp
```diff
.UseKestrel().ConfigureKestrel(options =>
{
options.Listen(IPAddress.IPv6Any, ...);
- options.Listen(IPAddress.Any, ...);
+ options.Listen(IPAddress.IPv6Any, ...);
})
```

or use another invocation - `options.ListenAnyIP()` without specifying any argument explicitly:
```csharp
Alternatively, use the `ListenAnyIP` method without specifying any argument:

```diff
.UseKestrel().ConfigureKestrel(options =>
{
options.ListenAnyIP(...);
- options.Listen(IPAddress.Any, ...);
+ options.ListenAnyIP(...);
})
```

## When to suppress warnings

The severity level of this diagnostic is Information. You can suppress warnings if your intention is to disable `IPv6` usage completely on the server.
The `ASP0028` diagnostic has a Information level severity. Suppress warnings if your intention is to disable `IPv6` usage completely on the server, although this comes with the risk of the performance problems mentions in this article

You can disable IPv6 either system-wide, or for .NET only via the [AppCtx switch or environment variable](https://devblogs.microsoft.com/dotnet/dotnet-6-networking-improvements/#an-option-to-globally-disable-ipv6)
`IPv6` can be disabled either system-wide, or for .NET only via the [AppCtx switch or environment variable](https://devblogs.microsoft.com/dotnet/dotnet-6-networking-improvements/#an-option-to-globally-disable-ipv6)
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#define TREE // DEFAULT RR RH DB DF DF2 UFS UFS2 TREE FECTP NS MUL MULT2
#define RR // DEFAULT RR RH DB DF DF2 UFS UFS2 TREE FECTP NS MUL MULT2
// Test1
#if NEVER
#elif DEFAULT
Expand Down
Loading