Skip to content

Commit a135bea

Browse files
Kestrel named pipes /n/1 (#34640)
* Kestrel named pipes * Kestrel named pipes * Kestrel named pipes * Kestrel named pipes * Kestrel named pipes * Kestrel named pipes * Kestrel named pipes * Kestrel named pipes * Kestrel named pipes * Kestrel named pipes * Kestrel named pipes * Kestrel named pipes * Kestrel named pipes * Kestrel named pipes * remove pipOptions * Update sample * Update sample * Update aspnetcore/fundamentals/servers/kestrel/endpoints.md * Update aspnetcore/fundamentals/servers/kestrel/endpoints.md --------- Co-authored-by: James Newton-King <[email protected]>
1 parent b83f57d commit a135bea

File tree

2 files changed

+43
-6
lines changed

2 files changed

+43
-6
lines changed

aspnetcore/fundamentals/servers/kestrel/endpoints.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -581,6 +581,22 @@ The following example configures an endpoint for HTTP/1.1, HTTP/2, and HTTP/3 co
581581

582582
:::code language="csharp" source="~/fundamentals/servers/kestrel/samples/6.x/KestrelSample/Snippets/Program.cs" id="snippet_ConfigureKestrelProtocols":::
583583

584+
:::moniker-end
585+
586+
:::moniker range=">= aspnetcore-9.0"
587+
588+
## Customize Kestrel named pipe endpoints
589+
590+
Kestrel's named pipe support includes advanced customization options. The [CreateNamedPipeServerStream](/dotnet/api/microsoft.aspnetcore.server.kestrel.transport.namedpipes.namedpipetransportoptions.createnamedpipeserverstream) property on the named pipe options allows pipes to be customized per-endpoint.
591+
592+
This is useful, for example, in a Kestrel app that requires two pipe endpoints with different [access security](/windows/win32/ipc/named-pipe-security-and-access-rights). The `CreateNamedPipeServerStream` option can be used to create pipes with custom security settings, depending on the pipe name.
593+
594+
:::code language="csharp" source="~/fundamentals/servers/kestrel/endpoints/samples/KestrelNamedEP/Program.cs" highlight="15-33" id="snippet_1":::
595+
596+
:::moniker-end
597+
598+
:::moniker range=">= aspnetcore-8.0"
599+
584600
## See also
585601

586602
* <xref:fundamentals/servers/kestrel>
Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,42 @@
1+
// <snippet_1>
12
using System.IO.Pipes;
3+
using System.Security.AccessControl;
4+
using System.Security.Principal;
25

36
var builder = WebApplication.CreateBuilder();
47

58
builder.WebHost.ConfigureKestrel(options =>
69
{
7-
options.ListenNamedPipe("pipe1");
8-
options.ListenNamedPipe("pipe2");
10+
options.ListenNamedPipe("defaultPipe");
11+
options.ListenNamedPipe("securedPipe");
912
});
1013

1114
builder.WebHost.UseNamedPipes(options =>
1215
{
1316
options.CreateNamedPipeServerStream = (context) =>
1417
{
15-
var pipeSecurity = CreatePipeSecurity(context.NamedPipeEndpoint.PipeName);
18+
var pipeName = context.NamedPipeEndPoint.PipeName;
19+
20+
switch (pipeName)
21+
{
22+
case "defaultPipe":
23+
return NamedPipeTransportOptions.CreateDefaultNamedPipeServerStream(context);
24+
case "securedPipe":
25+
var allowSecurity = new PipeSecurity();
26+
allowSecurity.AddAccessRule(new PipeAccessRule("Users", PipeAccessRights.FullControl, AccessControlType.Allow));
1627

17-
return NamedPipeServerStreamAcl.Create(context.NamedPipeEndPoint.PipeName, PipeDirection.InOut,
18-
NamedPipeServerStream.MaxAllowedServerInstances, PipeTransmissionMode.Byte,
19-
context.PipeOptions, inBufferSize: 0, outBufferSize: 0, pipeSecurity);
28+
return NamedPipeServerStreamAcl.Create(pipeName, PipeDirection.InOut,
29+
NamedPipeServerStream.MaxAllowedServerInstances, PipeTransmissionMode.Byte,
30+
context.PipeOptions, inBufferSize: 0, outBufferSize: 0, allowSecurity);
31+
default:
32+
throw new InvalidOperationException($"Unexpected pipe name: {pipeName}");
33+
}
2034
};
2135
});
36+
37+
var app = builder.Build();
38+
39+
app.MapGet("/", () => "Hello World!");
40+
41+
app.Run();
42+
// </snippet_1>

0 commit comments

Comments
 (0)