是否可以读取 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();
}