var handler = new SocketsHttpHandler
{
PlaintextStreamFilter = (context, _) => new ValueTask<Stream>(new StreamWrapper(context.PlaintextStream)),
};
var client = new HttpClient(handler);
var guruguru1 = await client.GetAsync("http://www.bilibili.com");
guruguru1.EnsureSuccessStatusCode();
Console.WriteLine($"{DateTime.Now} guruguru1 OK!");
var guruguru2 = await client.GetAsync("http://www.bilibili.com");
guruguru2.EnsureSuccessStatusCode();
Console.WriteLine($"{DateTime.Now} guruguru2 OK!");
internal class StreamWrapper(Stream bs) : Stream
{
public override void Flush() => bs.Flush();
public override int Read(byte[] buffer, int offset, int count)
{
Console.WriteLine($"[{DateTime.Now}] Read!");
return bs.Read(buffer, offset, count);
}
public override long Seek(long offset, SeekOrigin origin) => bs.Seek(offset, origin);
public override void SetLength(long value) => bs.SetLength(value);
public override void Write(byte[] buffer, int offset, int count)
{
Console.WriteLine($"[{DateTime.Now}] Write!");
bs.Write(buffer, offset, count);
}
public override bool CanRead => bs.CanRead;
public override bool CanSeek => bs.CanSeek;
public override bool CanWrite => bs.CanWrite;
public override long Length => bs.Length;
public override long Position
{
get => bs.Position;
set => bs.Position = value;
}
}