是否可以读取 HTTPClient 发送的 XmlSerializer 的结果?
Is it possible to read results of the XmlSerializer being sent by HTTPClient?
我正在使用扩展方法 post xml 使用 HTTPClient 效果很好。
我的问题:是否可以读取、记录或显示正在 sent/posted 的 XmlSerializer 数据的结果?
public static class HttpExtensions {
public static Task<HttpResponseMessage> PostAsXmlWithSerializerAsync<T>(this HttpClient client, string requestUri, T value)
{
return client.PostAsync(requestUri
, value
, new XmlMediaTypeFormatter { UseXmlSerializer = true }
);
}
}
是的,你可以。
下载并安装 Fiddler ,然后过滤你的 requestUri
,你可以监控所有传输数据,如你序列化 xml.
PostAsync
向您隐藏实际发送的 HttpRequestMessage
,尽管您也可以从响应中检索它,因此您可以跟踪请求和响应内容:
var response = await client.PostAsync(uri, value, formatter);
Log(response);
如果您确实只想记录请求,请手动创建请求:
var request = new HttpRequestMessage(HttpMethod.Post, uri);
request.Content = new StreamContent(myXmlStream);
Log(request);
var response = await client.SendAsync(request);
Log(response);
现在您可以创建一两个 Log
重载。我将其显示为响应,其中包括请求和响应日志。这与格式无关,适用于 XML 和 json 内容。
protected virtual void Log(HttpResponseMessage response)
{
// Use any log/trace engine here, this example uses Debug
Debug.WriteLine($"Response of the API Call [{response.RequestMessage.Method}] {response.RequestMessage.RequestUri}: {response.StatusCode} {FormatResponse(response)}");
}
private static string FormatResponse(HttpResponseMessage response)
{
var result = new StringBuilder();
result.AppendLine();
result.AppendLine("Original request:");
result.AppendLine(FormatHttpMessage(response.RequestMessage.Headers, response.RequestMessage.Content));
result.AppendLine();
result.AppendLine("Obtained response:");
result.AppendLine(FormatHttpMessage(response.Headers, response.Content));
}
private static string FormatHttpMessage(HttpHeaders headers, HttpContent content)
{
var result = new StringBuilder();
var headersString = headers.ToString();
if (!string.IsNullOrWhiteSpace(headersString))
{
result.AppendLine("Headers:");
result.AppendLine(headersString);
result.AppendLine();
}
if (content != null)
{
result.AppendLine("Content:");
result.AppendLine(content.ReadAsStringAsync().Result);
}
return result.ToString();
}
我正在使用扩展方法 post xml 使用 HTTPClient 效果很好。
我的问题:是否可以读取、记录或显示正在 sent/posted 的 XmlSerializer 数据的结果?
public static class HttpExtensions {
public static Task<HttpResponseMessage> PostAsXmlWithSerializerAsync<T>(this HttpClient client, string requestUri, T value)
{
return client.PostAsync(requestUri
, value
, new XmlMediaTypeFormatter { UseXmlSerializer = true }
);
}
}
是的,你可以。
下载并安装 Fiddler ,然后过滤你的 requestUri
,你可以监控所有传输数据,如你序列化 xml.
PostAsync
向您隐藏实际发送的 HttpRequestMessage
,尽管您也可以从响应中检索它,因此您可以跟踪请求和响应内容:
var response = await client.PostAsync(uri, value, formatter);
Log(response);
如果您确实只想记录请求,请手动创建请求:
var request = new HttpRequestMessage(HttpMethod.Post, uri);
request.Content = new StreamContent(myXmlStream);
Log(request);
var response = await client.SendAsync(request);
Log(response);
现在您可以创建一两个 Log
重载。我将其显示为响应,其中包括请求和响应日志。这与格式无关,适用于 XML 和 json 内容。
protected virtual void Log(HttpResponseMessage response)
{
// Use any log/trace engine here, this example uses Debug
Debug.WriteLine($"Response of the API Call [{response.RequestMessage.Method}] {response.RequestMessage.RequestUri}: {response.StatusCode} {FormatResponse(response)}");
}
private static string FormatResponse(HttpResponseMessage response)
{
var result = new StringBuilder();
result.AppendLine();
result.AppendLine("Original request:");
result.AppendLine(FormatHttpMessage(response.RequestMessage.Headers, response.RequestMessage.Content));
result.AppendLine();
result.AppendLine("Obtained response:");
result.AppendLine(FormatHttpMessage(response.Headers, response.Content));
}
private static string FormatHttpMessage(HttpHeaders headers, HttpContent content)
{
var result = new StringBuilder();
var headersString = headers.ToString();
if (!string.IsNullOrWhiteSpace(headersString))
{
result.AppendLine("Headers:");
result.AppendLine(headersString);
result.AppendLine();
}
if (content != null)
{
result.AppendLine("Content:");
result.AppendLine(content.ReadAsStringAsync().Result);
}
return result.ToString();
}