2012-02-25 76 views
4

我很喜歡HttpClient的體系結構 - 但我無法弄清楚如何添加一個「不太標準」的媒體類型來處理XmlSerializer的。閱讀自定義內容類型(fe StackOverflow)飼料使用來自WebAPI的HttpClient

此代碼:

var cli = new HttpClient(); 
cli 
    .GetAsync("http://stackoverflow.com/feeds/tag?tagnames=delphi&sort=newest") 
    .ContinueWith(task => 
    { 
     task.Result.Content.ReadAsAsync<Feed>(); 
    }); 

時指出,有「文/ XML」的內容類型原子飼料工作正常,但一個在本例中失敗,並「否‘MediaTypeFormatter’可用使用媒體類型'application/atom + xml'「消息讀取類型爲'Feed'的對象。 我嘗試了爲XmlMediaTypeFormatter指定MediaRangeMappings(作爲參數傳遞給ReadAsAsync)但沒有成功的不同組合。

什麼是「推薦」的方式來配置HttpClient映射「application/atom + xml」和「application/rss + xml」到XmlSerializer?

回答

4

這裏是工作(學分ASP.net forum thread)代碼:

public class AtomFormatter : XmlMediaTypeFormatter 
{ 
    public AtomFormatter() 
    { 
     SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/atom+xml")); 
    } 

    protected override bool CanReadType(Type type) 
    { 
     return base.CanReadType(type) || type == typeof(Feed); 
    } 
} 

var cli = new HttpClient(); 
cli 
    .GetAsync("http://stackoverflow.com/feeds/tag?tagnames=delphi&sort=newest") 
    .ContinueWith(task => 
    { 
     task.Result.Content.ReadAsAsync<Feed>(new[] { new AtomFormatter }); 
    }); 

不過,想看看沒有子XmlMediaTypeFormatter的解決方案 - 任何人?

0

問題是,您正嘗試將結果直接轉換爲Feed。由於錯誤很明顯,它不能指望我們如何將application/atom+xml轉換爲Feed

您將不得不返回XML格式,然後使用和XmlReader來初始化您的Feed。

另一種方法是提供自己的媒體格式化程序 - 以及封裝它的實現。

+0

請注意 - 如果原子提要具有「text/xml」或「application/xml」作爲Content-Type,則「將結果直接轉換爲提要」工作正常,在後臺使用XmlSerializer。所以這個問題必須有一個只使用配置/映射的解決方案。 – 2012-02-26 18:27:14

+0

@SergeyAldoukhov所以如果內容類型是XML,它的工作原理?我很驚訝......他們必須將該名稱空間+根的翻譯硬編碼到Feed中,如果它真的很糟糕。 – Aliostad 2012-02-26 19:10:56