Skip to content

Commit

Permalink
Experiment with named pipes transport
Browse files Browse the repository at this point in the history
API review feedback

Support named pipe from urls argument

Rebased
  • Loading branch information
JamesNK committed Dec 9, 2022
1 parent f543e35 commit 2175393
Show file tree
Hide file tree
Showing 40 changed files with 1,880 additions and 57 deletions.
56 changes: 38 additions & 18 deletions AspNetCore.sln
Original file line number Diff line number Diff line change
Expand Up @@ -1756,6 +1756,12 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "perf", "perf", "{74377D3E-E
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Server.HttpSys.Microbenchmarks", "src\Servers\HttpSys\perf\Microbenchmarks\Microsoft.AspNetCore.Server.HttpSys.Microbenchmarks.csproj", "{3C7C65BF-0C13-418E-90BD-EC9C3CD282CB}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Transport.NamedPipes", "Transport.NamedPipes", "{F057512B-55BF-4A8B-A027-A0505F8BA10C}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Server.Kestrel.Transport.NamedPipes", "src\Servers\Kestrel\Transport.NamedPipes\src\Microsoft.AspNetCore.Server.Kestrel.Transport.NamedPipes.csproj", "{10173568-A65E-44E5-8C6F-4AA49D0577A1}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Server.Kestrel.Transport.NamedPipes.Tests", "src\Servers\Kestrel\Transport.NamedPipes\test\Microsoft.AspNetCore.Server.Kestrel.Transport.NamedPipes.Tests.csproj", "{97C7D2A4-87E5-4A4A-A170-D736427D5C21}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Expand Down Expand Up @@ -10517,22 +10523,38 @@ Global
{A8E2AB77-8F57-47C2-A961-2F316793CAFF}.Release|x64.Build.0 = Release|Any CPU
{A8E2AB77-8F57-47C2-A961-2F316793CAFF}.Release|x86.ActiveCfg = Release|Any CPU
{A8E2AB77-8F57-47C2-A961-2F316793CAFF}.Release|x86.Build.0 = Release|Any CPU
{3C7C65BF-0C13-418E-90BD-EC9C3CD282CB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3C7C65BF-0C13-418E-90BD-EC9C3CD282CB}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3C7C65BF-0C13-418E-90BD-EC9C3CD282CB}.Debug|arm64.ActiveCfg = Debug|Any CPU
{3C7C65BF-0C13-418E-90BD-EC9C3CD282CB}.Debug|arm64.Build.0 = Debug|Any CPU
{3C7C65BF-0C13-418E-90BD-EC9C3CD282CB}.Debug|x64.ActiveCfg = Debug|Any CPU
{3C7C65BF-0C13-418E-90BD-EC9C3CD282CB}.Debug|x64.Build.0 = Debug|Any CPU
{3C7C65BF-0C13-418E-90BD-EC9C3CD282CB}.Debug|x86.ActiveCfg = Debug|Any CPU
{3C7C65BF-0C13-418E-90BD-EC9C3CD282CB}.Debug|x86.Build.0 = Debug|Any CPU
{3C7C65BF-0C13-418E-90BD-EC9C3CD282CB}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3C7C65BF-0C13-418E-90BD-EC9C3CD282CB}.Release|Any CPU.Build.0 = Release|Any CPU
{3C7C65BF-0C13-418E-90BD-EC9C3CD282CB}.Release|arm64.ActiveCfg = Release|Any CPU
{3C7C65BF-0C13-418E-90BD-EC9C3CD282CB}.Release|arm64.Build.0 = Release|Any CPU
{3C7C65BF-0C13-418E-90BD-EC9C3CD282CB}.Release|x64.ActiveCfg = Release|Any CPU
{3C7C65BF-0C13-418E-90BD-EC9C3CD282CB}.Release|x64.Build.0 = Release|Any CPU
{3C7C65BF-0C13-418E-90BD-EC9C3CD282CB}.Release|x86.ActiveCfg = Release|Any CPU
{3C7C65BF-0C13-418E-90BD-EC9C3CD282CB}.Release|x86.Build.0 = Release|Any CPU
{B6B74AC7-63AE-49E0-8283-C7B230BE12BD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B6B74AC7-63AE-49E0-8283-C7B230BE12BD}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B6B74AC7-63AE-49E0-8283-C7B230BE12BD}.Debug|arm64.ActiveCfg = Debug|Any CPU
{B6B74AC7-63AE-49E0-8283-C7B230BE12BD}.Debug|arm64.Build.0 = Debug|Any CPU
{B6B74AC7-63AE-49E0-8283-C7B230BE12BD}.Debug|x64.ActiveCfg = Debug|Any CPU
{B6B74AC7-63AE-49E0-8283-C7B230BE12BD}.Debug|x64.Build.0 = Debug|Any CPU
{B6B74AC7-63AE-49E0-8283-C7B230BE12BD}.Debug|x86.ActiveCfg = Debug|Any CPU
{B6B74AC7-63AE-49E0-8283-C7B230BE12BD}.Debug|x86.Build.0 = Debug|Any CPU
{B6B74AC7-63AE-49E0-8283-C7B230BE12BD}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B6B74AC7-63AE-49E0-8283-C7B230BE12BD}.Release|Any CPU.Build.0 = Release|Any CPU
{B6B74AC7-63AE-49E0-8283-C7B230BE12BD}.Release|arm64.ActiveCfg = Release|Any CPU
{B6B74AC7-63AE-49E0-8283-C7B230BE12BD}.Release|arm64.Build.0 = Release|Any CPU
{B6B74AC7-63AE-49E0-8283-C7B230BE12BD}.Release|x64.ActiveCfg = Release|Any CPU
{B6B74AC7-63AE-49E0-8283-C7B230BE12BD}.Release|x64.Build.0 = Release|Any CPU
{B6B74AC7-63AE-49E0-8283-C7B230BE12BD}.Release|x86.ActiveCfg = Release|Any CPU
{B6B74AC7-63AE-49E0-8283-C7B230BE12BD}.Release|x86.Build.0 = Release|Any CPU
{97C7D2A4-87E5-4A4A-A170-D736427D5C21}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{97C7D2A4-87E5-4A4A-A170-D736427D5C21}.Debug|Any CPU.Build.0 = Debug|Any CPU
{97C7D2A4-87E5-4A4A-A170-D736427D5C21}.Debug|arm64.ActiveCfg = Debug|Any CPU
{97C7D2A4-87E5-4A4A-A170-D736427D5C21}.Debug|arm64.Build.0 = Debug|Any CPU
{97C7D2A4-87E5-4A4A-A170-D736427D5C21}.Debug|x64.ActiveCfg = Debug|Any CPU
{97C7D2A4-87E5-4A4A-A170-D736427D5C21}.Debug|x64.Build.0 = Debug|Any CPU
{97C7D2A4-87E5-4A4A-A170-D736427D5C21}.Debug|x86.ActiveCfg = Debug|Any CPU
{97C7D2A4-87E5-4A4A-A170-D736427D5C21}.Debug|x86.Build.0 = Debug|Any CPU
{97C7D2A4-87E5-4A4A-A170-D736427D5C21}.Release|Any CPU.ActiveCfg = Release|Any CPU
{97C7D2A4-87E5-4A4A-A170-D736427D5C21}.Release|Any CPU.Build.0 = Release|Any CPU
{97C7D2A4-87E5-4A4A-A170-D736427D5C21}.Release|arm64.ActiveCfg = Release|Any CPU
{97C7D2A4-87E5-4A4A-A170-D736427D5C21}.Release|arm64.Build.0 = Release|Any CPU
{97C7D2A4-87E5-4A4A-A170-D736427D5C21}.Release|x64.ActiveCfg = Release|Any CPU
{97C7D2A4-87E5-4A4A-A170-D736427D5C21}.Release|x64.Build.0 = Release|Any CPU
{97C7D2A4-87E5-4A4A-A170-D736427D5C21}.Release|x86.ActiveCfg = Release|Any CPU
{97C7D2A4-87E5-4A4A-A170-D736427D5C21}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand Down Expand Up @@ -11398,8 +11420,6 @@ Global
{890B5210-48EF-488F-93A2-F13BCB07C780} = {4DA84F2B-1948-439B-85AB-E99E31331A9C}
{A8E2AB77-8F57-47C2-A961-2F316793CAFF} = {890B5210-48EF-488F-93A2-F13BCB07C780}
{F43CC5EA-6032-4A11-A9B2-6D48CB5EB082} = {4DA84F2B-1948-439B-85AB-E99E31331A9C}
{74377D3E-E0C6-41A4-89ED-11A9C00142A9} = {166E48ED-9738-4E13-8618-0D805F6F0F65}
{3C7C65BF-0C13-418E-90BD-EC9C3CD282CB} = {74377D3E-E0C6-41A4-89ED-11A9C00142A9}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {3E8720B3-DBDD-498C-B383-2CC32A054E8F}
Expand Down
1 change: 1 addition & 0 deletions eng/ProjectReferences.props
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@
<ProjectReferenceProvider Include="Microsoft.AspNetCore.Server.IIS" ProjectPath="$(RepoRoot)src\Servers\IIS\IIS\src\Microsoft.AspNetCore.Server.IIS.csproj" />
<ProjectReferenceProvider Include="Microsoft.AspNetCore.Server.Kestrel.Core" ProjectPath="$(RepoRoot)src\Servers\Kestrel\Core\src\Microsoft.AspNetCore.Server.Kestrel.Core.csproj" />
<ProjectReferenceProvider Include="Microsoft.AspNetCore.Server.Kestrel" ProjectPath="$(RepoRoot)src\Servers\Kestrel\Kestrel\src\Microsoft.AspNetCore.Server.Kestrel.csproj" />
<ProjectReferenceProvider Include="Microsoft.AspNetCore.Server.Kestrel.Transport.NamedPipes" ProjectPath="$(RepoRoot)src\Servers\Kestrel\Transport.NamedPipes\src\Microsoft.AspNetCore.Server.Kestrel.Transport.NamedPipes.csproj" />
<ProjectReferenceProvider Include="Microsoft.AspNetCore.Server.Kestrel.Transport.Quic" ProjectPath="$(RepoRoot)src\Servers\Kestrel\Transport.Quic\src\Microsoft.AspNetCore.Server.Kestrel.Transport.Quic.csproj" />
<ProjectReferenceProvider Include="Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets" ProjectPath="$(RepoRoot)src\Servers\Kestrel\Transport.Sockets\src\Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.csproj" />
<ProjectReferenceProvider Include="Microsoft.AspNetCore.Authentication.Certificate" ProjectPath="$(RepoRoot)src\Security\Authentication\Certificate\src\Microsoft.AspNetCore.Authentication.Certificate.csproj" />
Expand Down
1 change: 1 addition & 0 deletions eng/SharedFramework.Local.props
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@
<AspNetCoreAppReference Include="Microsoft.AspNetCore.Server.IIS" />
<AspNetCoreAppReference Include="Microsoft.AspNetCore.Server.Kestrel.Core" />
<AspNetCoreAppReference Include="Microsoft.AspNetCore.Server.Kestrel" />
<AspNetCoreAppReference Include="Microsoft.AspNetCore.Server.Kestrel.Transport.NamedPipes" />
<AspNetCoreAppReference Include="Microsoft.AspNetCore.Server.Kestrel.Transport.Quic" />
<AspNetCoreAppReference Include="Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets" />
<AspNetCoreAppReference Include="Microsoft.AspNetCore.Authentication.Cookies" />
Expand Down
1 change: 1 addition & 0 deletions eng/TrimmableProjects.props
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
<TrimmableProject Include="Microsoft.AspNetCore.Server.IIS" />
<TrimmableProject Include="Microsoft.AspNetCore.Server.Kestrel.Core" />
<TrimmableProject Include="Microsoft.AspNetCore.Server.Kestrel" />
<TrimmableProject Include="Microsoft.AspNetCore.Server.Kestrel.Transport.NamedPipes" />
<TrimmableProject Include="Microsoft.AspNetCore.Server.Kestrel.Transport.Quic" />
<TrimmableProject Include="Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets" />
<TrimmableProject Include="Microsoft.AspNetCore.Authentication.Certificate" />
Expand Down
2 changes: 2 additions & 0 deletions src/Framework/test/TestData.cs
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@ static TestData()
"Microsoft.AspNetCore.Server.Kestrel",
"Microsoft.AspNetCore.Server.Kestrel.Core",
"Microsoft.AspNetCore.Server.Kestrel.Transport.Quic",
"Microsoft.AspNetCore.Server.Kestrel.Transport.NamedPipes",
"Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets",
"Microsoft.AspNetCore.Session",
"Microsoft.AspNetCore.SignalR",
Expand Down Expand Up @@ -228,6 +229,7 @@ static TestData()
{ "Microsoft.AspNetCore.Server.Kestrel.Core" },
{ "Microsoft.AspNetCore.Server.Kestrel.Transport.Quic" },
{ "Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets" },
{ "Microsoft.AspNetCore.Server.Kestrel.Transport.NamedPipes" },
{ "Microsoft.AspNetCore.Server.Kestrel" },
{ "Microsoft.AspNetCore.Session" },
{ "Microsoft.AspNetCore.SignalR.Common" },
Expand Down
52 changes: 45 additions & 7 deletions src/Http/Http/src/BindingAddress.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ namespace Microsoft.AspNetCore.Http;
public class BindingAddress
{
private const string UnixPipeHostPrefix = "unix:/";
private const string NamedPipeHostPrefix = "pipe:";

private BindingAddress(string host, string pathBase, int port, string scheme)
{
Expand Down Expand Up @@ -57,6 +58,14 @@ public BindingAddress()
/// </summary>
public bool IsUnixPipe => Host.StartsWith(UnixPipeHostPrefix, StringComparison.Ordinal);

/// <summary>
/// Gets a value that determines if this instance represents a named pipe.
/// <para>
/// Returns <see langword="true"/> if <see cref="Host"/> starts with <c>pipe:</c> prefix.
/// </para>
/// </summary>
public bool IsNamedPipe => Host.StartsWith(NamedPipeHostPrefix, StringComparison.Ordinal);

/// <summary>
/// Gets the unix pipe path if this instance represents a Unix pipe.
/// </summary>
Expand All @@ -73,6 +82,22 @@ public string UnixPipePath
}
}

/// <summary>
/// Gets the named pipe path if this instance represents a named pipe.
/// </summary>
public string NamedPipePath
{
get
{
if (!IsNamedPipe)
{
throw new InvalidOperationException("Binding address is not a named pipe.");
}

return GetNamedPipePath(Host);
}
}

private static string GetUnixPipePath(string host)
{
var unixPipeHostPrefixLength = UnixPipeHostPrefix.Length;
Expand All @@ -84,10 +109,12 @@ private static string GetUnixPipePath(string host)
return host.Substring(unixPipeHostPrefixLength);
}

private static string GetNamedPipePath(string host) => host.Substring(NamedPipeHostPrefix.Length);

/// <inheritdoc />
public override string ToString()
{
if (IsUnixPipe)
if (IsUnixPipe || IsNamedPipe)
{
return Scheme.ToLowerInvariant() + Uri.SchemeDelimiter + Host.ToLowerInvariant();
}
Expand Down Expand Up @@ -135,15 +162,11 @@ public static BindingAddress Parse(string address)
var schemeDelimiterEnd = schemeDelimiterStart + Uri.SchemeDelimiter.Length;

var isUnixPipe = address.IndexOf(UnixPipeHostPrefix, schemeDelimiterEnd, StringComparison.Ordinal) == schemeDelimiterEnd;
var isNamedPipe = address.IndexOf(NamedPipeHostPrefix, schemeDelimiterEnd, StringComparison.Ordinal) == schemeDelimiterEnd;

int pathDelimiterStart;
int pathDelimiterEnd;
if (!isUnixPipe)
{
pathDelimiterStart = address.IndexOf("/", schemeDelimiterEnd, StringComparison.Ordinal);
pathDelimiterEnd = pathDelimiterStart;
}
else
if (isUnixPipe)
{
var unixPipeHostPrefixLength = UnixPipeHostPrefix.Length;
if (OperatingSystem.IsWindows())
Expand All @@ -159,6 +182,16 @@ public static BindingAddress Parse(string address)
pathDelimiterStart = address.IndexOf(":", schemeDelimiterEnd + unixPipeHostPrefixLength, StringComparison.Ordinal);
pathDelimiterEnd = pathDelimiterStart + ":".Length;
}
else if (isNamedPipe)
{
pathDelimiterStart = address.IndexOf(":", schemeDelimiterEnd + NamedPipeHostPrefix.Length, StringComparison.Ordinal);
pathDelimiterEnd = pathDelimiterStart + ":".Length;
}
else
{
pathDelimiterStart = address.IndexOf("/", schemeDelimiterEnd, StringComparison.Ordinal);
pathDelimiterEnd = pathDelimiterStart;
}

if (pathDelimiterStart < 0)
{
Expand Down Expand Up @@ -215,6 +248,11 @@ public static BindingAddress Parse(string address)
throw new FormatException($"Invalid url, unix socket path must be absolute: '{address}'");
}

if (isNamedPipe && GetNamedPipePath(host).Contains('\\'))
{
throw new FormatException($"Invalid url, pipe name must not contain backslashes: '{address}'");
}

string pathBase;
if (address[address.Length - 1] == '/')
{
Expand Down
2 changes: 2 additions & 0 deletions src/Http/Http/src/PublicAPI.Unshipped.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
#nullable enable
*REMOVED*Microsoft.AspNetCore.Http.StreamResponseBodyFeature.StreamResponseBodyFeature(System.IO.Stream! stream, Microsoft.AspNetCore.Http.Features.IHttpResponseBodyFeature! priorFeature) -> void
Microsoft.AspNetCore.Http.BindingAddress.IsNamedPipe.get -> bool
Microsoft.AspNetCore.Http.BindingAddress.NamedPipePath.get -> string!
Microsoft.AspNetCore.Http.StreamResponseBodyFeature.StreamResponseBodyFeature(System.IO.Stream! stream, Microsoft.AspNetCore.Http.Features.IHttpResponseBodyFeature? priorFeature) -> void
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System.IO.Pipes;

namespace Microsoft.AspNetCore.Connections.Features;

/// <summary>
/// Provides access to the connection's underlying <see cref="NamedPipeServerStream"/>.
/// </summary>
public interface IConnectionNamedPipeFeature
{
/// <summary>
/// Gets the underlying <see cref="NamedPipeServerStream"/>.
/// </summary>
NamedPipeServerStream NamedPipe { get; }
}
65 changes: 65 additions & 0 deletions src/Servers/Connections.Abstractions/src/NamedPipeEndPoint.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System.Diagnostics.CodeAnalysis;
using System.Net;

namespace Microsoft.AspNetCore.Connections;

/// <summary>
/// Represents a Named Pipe endpoint.
/// </summary>
public sealed class NamedPipeEndPoint : EndPoint
{
internal const string LocalComputerServerName = ".";

/// <summary>
/// Initializes a new instance of the <see cref="NamedPipeEndPoint"/> class.
/// </summary>
/// <param name="pipeName">The name of the pipe.</param>
public NamedPipeEndPoint(string pipeName) : this(pipeName, LocalComputerServerName)
{
}

/// <summary>
/// Initializes a new instance of the <see cref="NamedPipeEndPoint"/> class.
/// </summary>
/// <param name="pipeName">The name of the pipe.</param>
/// <param name="serverName">The name of the remote computer to connect to, or "." to specify the local computer.</param>
public NamedPipeEndPoint(string pipeName, string serverName)
{
ServerName = serverName;
PipeName = pipeName;
}

/// <summary>
/// Gets the name of the remote computer. The server name must be ".", the local computer, when creating a server.
/// </summary>
public string ServerName { get; }

/// <summary>
/// Gets the name of the pipe.
/// </summary>
public string PipeName { get; }

/// <summary>
/// Gets the pipe name represented by this <see cref="NamedPipeEndPoint"/> instance.
/// </summary>
public override string ToString()
{
// Based on format at https://learn.microsoft.com/windows/win32/ipc/pipe-names
return $@"\\{ServerName}\pipe\{PipeName}";
}

/// <inheritdoc/>
public override bool Equals([NotNullWhen(true)] object? obj)
{
return obj is NamedPipeEndPoint other && other.ServerName == ServerName && other.PipeName == PipeName;
}

/// <inheritdoc/>
public override int GetHashCode()
{
return ServerName.GetHashCode() ^ PipeName.GetHashCode();
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,15 @@
#nullable enable
Microsoft.AspNetCore.Connections.Features.IConnectionNamedPipeFeature
Microsoft.AspNetCore.Connections.Features.IConnectionNamedPipeFeature.NamedPipe.get -> System.IO.Pipes.NamedPipeServerStream!
Microsoft.AspNetCore.Connections.Features.IStreamClosedFeature
Microsoft.AspNetCore.Connections.Features.IStreamClosedFeature.OnClosed(System.Action<object?>! callback, object? state) -> void
Microsoft.AspNetCore.Connections.IConnectionListenerFactorySelector
Microsoft.AspNetCore.Connections.IConnectionListenerFactorySelector.CanBind(System.Net.EndPoint! endpoint) -> bool
Microsoft.AspNetCore.Connections.NamedPipeEndPoint
Microsoft.AspNetCore.Connections.NamedPipeEndPoint.NamedPipeEndPoint(string! pipeName) -> void
Microsoft.AspNetCore.Connections.NamedPipeEndPoint.NamedPipeEndPoint(string! pipeName, string! serverName) -> void
Microsoft.AspNetCore.Connections.NamedPipeEndPoint.PipeName.get -> string!
Microsoft.AspNetCore.Connections.NamedPipeEndPoint.ServerName.get -> string!
override Microsoft.AspNetCore.Connections.NamedPipeEndPoint.Equals(object? obj) -> bool
override Microsoft.AspNetCore.Connections.NamedPipeEndPoint.GetHashCode() -> int
override Microsoft.AspNetCore.Connections.NamedPipeEndPoint.ToString() -> string!
Original file line number Diff line number Diff line change
@@ -1,8 +1,18 @@
#nullable enable
Microsoft.AspNetCore.Connections.Features.IConnectionNamedPipeFeature
Microsoft.AspNetCore.Connections.Features.IConnectionNamedPipeFeature.NamedPipe.get -> System.IO.Pipes.NamedPipeServerStream!
Microsoft.AspNetCore.Connections.Features.IStreamClosedFeature
Microsoft.AspNetCore.Connections.Features.IStreamClosedFeature.OnClosed(System.Action<object?>! callback, object? state) -> void
Microsoft.AspNetCore.Connections.IConnectionListenerFactorySelector
Microsoft.AspNetCore.Connections.IConnectionListenerFactorySelector.CanBind(System.Net.EndPoint! endpoint) -> bool
Microsoft.AspNetCore.Connections.NamedPipeEndPoint
Microsoft.AspNetCore.Connections.NamedPipeEndPoint.NamedPipeEndPoint(string! pipeName) -> void
Microsoft.AspNetCore.Connections.NamedPipeEndPoint.NamedPipeEndPoint(string! pipeName, string! serverName) -> void
Microsoft.AspNetCore.Connections.NamedPipeEndPoint.PipeName.get -> string!
Microsoft.AspNetCore.Connections.NamedPipeEndPoint.ServerName.get -> string!
override Microsoft.AspNetCore.Connections.NamedPipeEndPoint.Equals(object? obj) -> bool
override Microsoft.AspNetCore.Connections.NamedPipeEndPoint.GetHashCode() -> int
override Microsoft.AspNetCore.Connections.NamedPipeEndPoint.ToString() -> string!
Microsoft.AspNetCore.Connections.TlsConnectionCallbackContext
Microsoft.AspNetCore.Connections.TlsConnectionCallbackContext.ClientHelloInfo.get -> System.Net.Security.SslClientHelloInfo
Microsoft.AspNetCore.Connections.TlsConnectionCallbackContext.ClientHelloInfo.set -> void
Expand Down
Loading

0 comments on commit 2175393

Please sign in to comment.