我如何(很好地)通过 .NET Core 中的 unix 域套接字发送 HTTP
How do I (nicely) send HTTP over a unix-domain socket in .NET Core
在 .NET Core 中,我可以通过 unix 域套接字发送原始 HTTP,但我想使用库中的 HTTP 处理 类,而不是将我自己的 HTTP 处理组合在一起。
这是我目前工作但丑陋的代码:
const string HTTP_REQUEST = "POST /containers/foo/kill?signal=SIGHUP HTTP/1.0\r\n" +
"Host: localhost\r\n" +
"Accept: */*\r\n\r\n";
socket = new Socket(AddressFamily.Unix, SocketType.Stream, ProtocolType.IP);
socket.ReceiveTimeout = 2000; // 2 seconds
var endpoint = new UnixDomainSocketEndPoint("/var/run/docker.sock");
socket.Connect(endpoint);
byte[] requestBytes = Encoding.ASCII.GetBytes(HTTP_REQUEST);
socket.Send(requestBytes);
byte[] recvBytes = new byte[1024];
int numBytes = socket.Receive(recvBytes, 1024, SocketFlags.None);
socket.Disconnect(false);
Console.WriteLine( Encoding.ASCII.GetString(recvBytes));
有没有办法使用 .NET Core 库中的 类 来处理 unix 域套接字上的 HTTP 请求和响应?
[edit] 我知道在这个特定的用例中有 Docker.DotNet 库可以实现我想要的,但总的来说这个问题仍然值得一问。
在 .NET 5 中,将 ConnectCallback 添加到 SocketsHttpHandler 中,这使得这更容易一些,并不是说这是唯一的方法,但对我有用:
private static readonly HttpClient _httpClient = new HttpClient(new SocketsHttpHandler
{
ConnectCallback = async (context, token) =>
{
var socket = new Socket(AddressFamily.Unix, SocketType.Stream, ProtocolType.IP);
var endpoint = new UnixDomainSocketEndPoint("/var/run/test.sock");
await socket.ConnectAsync(endpoint);
return new NetworkStream(socket, ownsSocket: true);
}
});
public async Task TestSocket(string url)
{
var result = await _httpClient.GetStringAsync(url);
}
在 .NET Core 中,我可以通过 unix 域套接字发送原始 HTTP,但我想使用库中的 HTTP 处理 类,而不是将我自己的 HTTP 处理组合在一起。
这是我目前工作但丑陋的代码:
const string HTTP_REQUEST = "POST /containers/foo/kill?signal=SIGHUP HTTP/1.0\r\n" +
"Host: localhost\r\n" +
"Accept: */*\r\n\r\n";
socket = new Socket(AddressFamily.Unix, SocketType.Stream, ProtocolType.IP);
socket.ReceiveTimeout = 2000; // 2 seconds
var endpoint = new UnixDomainSocketEndPoint("/var/run/docker.sock");
socket.Connect(endpoint);
byte[] requestBytes = Encoding.ASCII.GetBytes(HTTP_REQUEST);
socket.Send(requestBytes);
byte[] recvBytes = new byte[1024];
int numBytes = socket.Receive(recvBytes, 1024, SocketFlags.None);
socket.Disconnect(false);
Console.WriteLine( Encoding.ASCII.GetString(recvBytes));
有没有办法使用 .NET Core 库中的 类 来处理 unix 域套接字上的 HTTP 请求和响应?
[edit] 我知道在这个特定的用例中有 Docker.DotNet 库可以实现我想要的,但总的来说这个问题仍然值得一问。
在 .NET 5 中,将 ConnectCallback 添加到 SocketsHttpHandler 中,这使得这更容易一些,并不是说这是唯一的方法,但对我有用:
private static readonly HttpClient _httpClient = new HttpClient(new SocketsHttpHandler
{
ConnectCallback = async (context, token) =>
{
var socket = new Socket(AddressFamily.Unix, SocketType.Stream, ProtocolType.IP);
var endpoint = new UnixDomainSocketEndPoint("/var/run/test.sock");
await socket.ConnectAsync(endpoint);
return new NetworkStream(socket, ownsSocket: true);
}
});
public async Task TestSocket(string url)
{
var result = await _httpClient.GetStringAsync(url);
}