WCF Web API, гамак и беды WP7

Столкнулся с интересной проблемой, когда я использую веб-API WCF с гамаком и WP7. Как вы знаете, WCF Web API позволяет вам изменять тип ответа в зависимости от того, что вы указали в заголовке Accept. Например, если вы отправляете Accept:application/json, ответом будет JSON, если вы укажете application/xml, вы получите XML и так далее.

Поэтому я создал свой веб-API, который прекрасно работает из веб-браузера. Как и ожидалось, я получаю типы, которые я хочу. Однако, когда я использую это из WP7, не имеет значения, что такое заголовок Accept, похоже, что WP7 заменяет его на /, и я получаю только XML обратно.

Я точно знаю, что проблема не в гамаке, потому что я пытался использовать Facebook Graph API. Если я изменяю Принять, чтобы сказать: приложение / привет, я получаю ошибку неверного запроса. Однако, когда я делаю это с WP7 в коде C#, я не получаю абсолютно никаких ошибок, и тип возвращаемого значения - XML, независимо от того, что я отправляю.

Чтобы обойти эту проблему, я создал сериализатор JSON.Net в своем веб-API WCF. Все работало отлично, пока я не начал использовать HttpResponseMessage в своих методах в качестве типов возврата. Теперь, хотя у меня есть сериализатор JSON, я получаю XML для всех методов, в которых я использую HttpResponseMessage.

Как вы можете видеть, я сейчас нахожусь в стране лала.

Может ли кто-нибудь предоставить обратную связь?

Любая помощь высоко ценится.

2 ответа

Решение

Я столкнулся с этим и разместил эту проблему на CodePlex. Это исправлено, если вы извлекаете последний источник, хотя Nuget еще не обновлен. После этого вы сможете удалить форматтер xml или очистить встроенные форматеры и добавить нужный. Другой обходной путь, который я нашел, состоял в том, чтобы очистить встроенные форматеры и создать собственный форматер медиа-типа, который сопоставлен с типом / accept.

Обновление: это было исправлено в WCF Web API Preview 6, теперь на nuget.

WCF WebApi позволяет вам указать формат, используя строку запроса, если хотите. Вам необходимо обновить конфигурацию с QueryStringMapping в дополнение к RequestHeaderMapping, который существует по умолчанию.

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    var config = routes.GetDefaultHttpConfiguration();

    var jsonFormatters = config.Formatters.Where(f => f.SupportedMediaTypes.Any(mt => mt.MediaType == "application/json"));
    jsonFormatters.ToList().ForEach(f => f.MediaTypeMappings.Add(new QueryStringMapping("format", "json", "application/json")));

    routes.MapServiceRoute<BooksService>("books", config);

    routes.MapRoute(
        "Default", // Route name
        "{controller}/{action}/{id}", // URL with parameters
        new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
    );
}
Другие вопросы по тегам