捕获客户端发送到服务器的所有数据
本文关键字:数据 服务器 客户端 | 更新日期: 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对象,并且也很容易修改到现有代码中。