Чтение пользовательских фидов Content-Type (например, StackOverflow) с использованием HttpClient из WebAPI - PullRequest
4 голосов
/ 26 февраля 2012

Мне очень нравится архитектура HttpClient, но я не могу понять, как добавить «не совсем стандартный» тип носителя для обработки XmlSerializer.

Этот код:

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

отлично работает, когда указывается на фиды атомов, которые имеют Content-Type «text / xml», но в примере с ошибкой «MediaTypeFormatter недоступен для чтения объекта типа'Feed' с типом носителя 'application / atom + xml' " сообщение.Я пробовал разные комбинации определения MediaRangeMappings для XmlMediaTypeFormatter (для передачи в качестве аргумента в ReadAsAsync), но безуспешно.

Что такое «рекомендуемый» способ настройки HttpClient для сопоставления «application / atom + xml»"и" application / rss + xml "для XmlSerializer?

Ответы [ 2 ]

4 голосов
/ 27 февраля 2012

Вот код, который работает (относится к ветке форума ASP.net ):

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 голосов
/ 26 февраля 2012

Проблема в том, что вы пытаетесь преобразовать результат прямо в канал.Как ясно говорит ошибка, мы не можем понять, как преобразовать application/atom+xml в Feed.

. Возможно, вам придется вернуться как XML, а затем использовать XmlReader для инициализации вашего фида.

Альтернативой является предоставление собственного средства форматирования мультимедиа - и реализация, которая включает это.

...