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

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

0 голосов
/ 13 октября 2011

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

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

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

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

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

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

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

Ответы [ 2 ]

1 голос
/ 13 октября 2011

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
    );
}
1 голос
/ 13 октября 2011

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

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

...