当我在Hammock和WP7上使用WCF Web API时遇到一个有趣的问题。如您所知,WCF Web API允许您根据在Accept标头中指定的内容更改响应类型。对于例如如果您发送Accept:application / json,则响应为JSON,如果指定application / xml,则获取XML等等。
所以我创建了我的Web API,它可以从Web浏览器中完美地运行。正如所料,我得到了我想要的类型。但是,当我在WP7中使用它时,接受标头是什么并不重要,看起来WP7将其替换为 / 而我只返回XML。
我知道这个问题不是Hammock,因为我尝试使用Facebook Graph API。如果我将Accept更改为: application / hello ,则会收到错误的请求错误。但是,当我在C#代码中使用WP7时,我绝对没有错误,返回类型是XML,无论我发送什么。
为了解决这个问题,我在WCF Web API中创建了一个JSON.Net Serializer。一切都运行良好,直到我开始在我的方法中使用HttpResponseMessage作为返回类型。现在,即使我有一个JSON序列化程序,我也可以使用HttpResponseMessage的所有方法获取XML。
如你所见,我现在在lala land。
任何人都可以提供反馈吗?
非常感谢任何帮助。
答案 0 :(得分:1)
我遇到了这个并在CodePlex上发布了this issue。虽然Nuget还没有更新,但是如果您提取最新的来源已得到修复。然后,您应该能够删除xml格式化程序或清除内置格式化程序并添加所需的格式化程序。我找到的另一个解决方法是清除内置格式化程序并创建映射到 / 接受类型的自定义媒体类型格式化程序。
更新:现在已经在nuget上使用WCF Web API Preview 6修复了这个问题。
答案 1 :(得分:1)
如果您愿意,WCF WebApi允许您使用查询字符串指定格式。除了默认情况下存在的RequestHeaderMapping之外,您还需要使用QueryStringMapping更新配置。
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
);
}