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
);
}