Sie sind hier: Weblog

HttpClient in Portable Class Libraries für .NET und Win8-Apps

Foto ,
01.03.2013 16:03:00

Erstellt man eine Portable Class Library für die Verwendung durch .NET und Windows 8-Apps, so kommt man zwar in den Genuss der Klasse HttpClient, allerdings wird man auch schnell feststellen, dass dieser Klasse einige Methoden, die bei reinen .NET-Projekten in Form von Erweiterungs-Methoden beiliegen, fehlen. Unter diesen fehlenden Methoden befinden sich häufig verwendete, wie zum Beispiel ReadAsAsync oder PostAsJsonAsync. Unter Verwendung des DataContractJsonSerializers, welcher ebenfalls in der Schnittmenge von .NET und Win8 (genauer: .NET-Profile for Windows Store apps) befindet, habe ich die zwei genannten Methoden in Form von Erweiterungsmethoden für den Einsatz mit JSON (nach)implementiert.
 
public static class HttpClientExtensions
{
    public static async Task<T> 
                ReadAsAsync<T>(this HttpContent content)
    {

        DataContractJsonSerializer dcjs = 
                   new DataContractJsonSerializer(typeof(T));
        using (var stream = await content.ReadAsStreamAsync())
        {
            return (T)dcjs.ReadObject(stream);
        }

    }

    public static async Task<HttpResponseMessage> 
                 PostAsJsonAsync<T>(this HttpClient client, string url, T obj)
    {
        DataContractJsonSerializer dcjs = 
                   new DataContractJsonSerializer(typeof(T));
        MemoryStream ms = new MemoryStream();
        dcjs.WriteObject(ms, obj);
        ms.Position = 0;

        var content = new StreamContent(ms);
        content.Headers.ContentType = 
                   new MediaTypeHeaderValue("text/json");

        return await client.PostAsync(url, content);

    }
}
Da hier clientseitig der DataContractJsonSerializer, welcher anstatt des akzeptierten ISO-Datumsformates ein Microsoft-spezifisches Datumsformat einsetzt, sollte man die Services, sofern man darauf Einfluss hat, auch zur Konfiguration dieses Datumsformates konfigurieren. Beim Einsatz von ASP.NET Web API gibt man dazu zum Beispiel in der Datei App_Start/WebApiConfig.cs an, dass man serverseitig auch den (alten) DataContractJsonSerializer einsetzen möchte

        config.Formatters.JsonFormatter.UseDataContractJsonSerializer = true;

oder man greift auf den standardmäßig eingesetzten Serializer JSON.Net zu und gibt an, dass dieser das Microsoft-spezifische Datumsformat verwenden soll:

        config.Formatters.JsonFormatter.SerializerSettings.DateFormatHandling = DateFormatHandling.MicrosoftDateFormat