단순 ..
객체 생성 로직에 핸들러를 넣으면 안되는데요.
이거 .. 매우 당당하게 넣어두었어요.
[1] SocketsHttpHandler.ConnectCallback 속성 (System.Net.Http) | Microsoft Learn
예시는 이케 하면 비슷할 것이어요.
var request = new Request(Done);
void Done(state, response) {
..
}언어를 가리지 않고 콜백이나 핸들러나 생성기에 넣으면 안대빈다.
public interface ICustomHttpClientService {
HttpClient CreateClient();
HttpClient CreateClient(string name);
}
public class CustomHttpClientService : HttpClient, ICustomHttpClientService {
const int TimeoutSecond = 5;
private static SocketsHttpHandler SocketHandler = new SocketsHttpHandler() {
ConnectCallback = ConnectionHandler,
ConnectTimeout= TimeSpan.FromSeconds(TimeoutSecond),
ResponseDrainTimeout = TimeSpan.FromSeconds(TimeoutSecond),
UseCookies = false
};
static HttpClientHandler HttpHandler = new HttpClientHandler() {
ClientCertificateOptions = ClientCertificateOption.Manual,
ServerCertificateCustomValidationCallback = ServerCertificateCustomValidationHandler,
UseCookies = false
};
static async ValueTask<Stream> ConnectionHandler(SocketsHttpConnectionContext context, CancellationToken cancellationToken) {
var socket = new Socket(SocketType.Stream, ProtocolType.Tcp) { NoDelay = true };
try {
socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true);
socket.SetSocketOption(SocketOptionLevel.Tcp, SocketOptionName.TcpKeepAliveTime, TimeoutSecond);
socket.SetSocketOption(SocketOptionLevel.Tcp, SocketOptionName.TcpKeepAliveInterval, TimeoutSecond);
socket.SetSocketOption(SocketOptionLevel.Tcp, SocketOptionName.TcpKeepAliveRetryCount, TimeoutSecond);
await socket.ConnectAsync(context.DnsEndPoint, cancellationToken);
return new NetworkStream(socket, true);
} catch {
socket.Dispose();
throw;
}
}
static bool ServerCertificateCustomValidationHandler(HttpRequestMessage message, X509Certificate2? certificate, X509Chain? chain, SslPolicyErrors errors) {
return true;
}
public CustomHttpClientService(HttpClient httpClient) : base(SocketsHandler, false) { // single handler problem SocketsHttpHandler or HttpClientHandler.
httpClient.Timeout = TimeSpan.FromSeconds(TimeoutSecond);
}
HttpClient ICustomClientService.CreateClient() {
return this;
}
HttpClient ICustomClientService.CreateClient(string name) {
return this;
}
}SocketsHttpHandler, HttpClientHandler 모두 적용이 안되고 .. 확장된 quic모듈은 이 핸들러가 유효하지도 않음.
C#쪽에서 너무 대충 하는거 아니나요.
