捕获客户端发送到服务器的所有数据

本文关键字:数据 服务器 客户端 | 更新日期: 2023-09-27 18:18:50

我正在使用HttpClient开发c#应用程序。我的代码是流经很多函数,然后最后它做一个postasync。

我想要做的是,我想要有一个EventHandler,当postasync完成时调用。在该事件处理程序中,我想捕获并打印客户端发送给服务器的所有内容。

这在。net HTTPClient中可能吗?

捕获客户端发送到服务器的所有数据

public void PostData(string data, Action<string> callback)
{
    var client = new HttpClient();
    var task = client.PostAsync("uri", new StringContent(data));
    task.ContinueWith((t) =>
    {
        t.Result.Content.ReadAsStringAsync().ContinueWith((trep) =>
        {
            string response = trep.Result;
            callback(response);
        });
    });
}

你可以定义一个事件委托,而不是使用Action<string> callback,这也给了你更多的灵活性来附加多个接收器。

public class PostEventArgs : EventArgs { public string Data { get; set; } }
public event EventHandler<PostEventArgs> postDone;
public void PostData(string data)
{
    var client = new HttpClient();
    var task = client.PostAsync("uri", new StringContent(data));
    task.ContinueWith((t) =>
    {
        t.Result.Content.ReadAsStringAsync().ContinueWith((trep) =>
        {
            string response = trep.Result;
            if (postDone != null)
                postDone(this, new PostEventArgs() { Data = response });
        });
    });
}

用法:

第一例
serviceObj.PostData("some data", (response)=> { Console.WriteLine(response); });

第二种情况

serviceObj.postDone += (obj,response)=>{ Console.WriteLine(response); }; // register only once
serviceObj.PostData("some data");

Task.ContinueWith更新

创建这样的消息处理程序类,

public class LoggingMessageHandler : DelegatingHandler
{
    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        var response = await base.SendAsync(request, cancellationToken);
        if (request.Method == HttpMethod.Post)
        {
            // Log whatever you want here
            Console.WriteLine(request.ToString());
            Console.WriteLine(response.ToString());
        }
        return response;
    }
}

,然后用消息处理程序创建HttpClient,作为请求/响应管道的一部分

var client = new HttpClient(new LoggingMessageHandler() {InnerHandler = new HttpClientHandler()});
client.PostAsync(...) // Whatever

从此时起,您发出的任何请求都将通过LoggingRequestHandler。

通过采用这种方法,您不需要包装HttpClient对象,并且也很容易修改到现有代码中。