2017-06-08 8 views
0

拡張メソッドを使用してxmlを投稿すると、HTTPClientがうまく動作します。HTTPClientから送信されたXmlSerializerの結果を読み取ることはできますか?

私の質問:送信、送信されている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 } 
           ); 
    } 
} 

答えて

0

PostAsyncを使用すると、両方の要求と応答の内容をトレースすることができますので、あなたも、応答からそれを取り出すことができますが、実際にあなたからHttpRequestMessageを送っ隠します

var request = new HttpRequestMessage(HttpMethod.Post, uri); 
request.Content = new StreamContent(myXmlStream); 
Log(request); 
var response = await client.SendAsync(request); 
Log(response); 

をそして今、あなたは、1つのまたは2つの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(); 
} 
0

はい、可能です。 Fiddlerをダウンロードしてインストールし、requestUriをフィルタリングすると、xmlのシリアル化などの転送データをすべて監視できます。あなたは本当に要求のみをログに記録する場合

var response = await client.PostAsync(uri, value, formatter); 
Log(response); 

関連する問題