2011-10-13 43 views
0

当我在Hammock和WP7中使用WCF Web API时,遇到了一个有趣的问题。如您所知,WCF Web API允许您根据您在Accept标头中指定的内容更改响应类型。对于例如如果你发送Accept:application/json,那么响应是JSON,如果你指定了application/xml,你得到了XML等等。WCF Web API,Hammock和WP7 Woes

所以我创建了我的Web API,它在Web浏览器中工作得非常好。正如所料,我得到了我想要的类型。但是,当我使用WP7时,无论Accept头是什么,它看起来像WP7将它替换为/,我只返回XML。

我知道一个事实,那就是不是Hammock,因为我尝试使用Facebook Graph API。如果我更改接受说:应用程序/你好,我得到一个错误的请求错误。然而,当我用WP7在C#代码中这样做时,我完全没有错误,返回类型是XML,而不管我发送的是什么。

为了规避这个问题,我在我的WCF Web API中创建了一个JSON.Net序列化程序。一切工作很好,直到我开始在我的方法中使用HttpResponseMessage作为返回类型。现在,即使我有一个JSON序列化程序,我也可以在所有使用HttpResponseMessage的方法中获得XML。

正如你所看到的,我现在在拉拉地。

任何人都可以提供任何反馈?

任何帮助,高度赞赏。

回答

1

我遇到了这个问题,并在CodePlex上发布了this issue。尽管Nuget尚未更新,但如果您拉取最新的源代码,它已被修复。然后,您应该能够删除xml格式化程序或清除内置格式化程序并添加所需的格式程序。我发现的另一个解决方法是清除内置格式化程序并创建映射到接受类型的自定义媒体类型格式化程序。

更新:现已在nuget上使用WCF Web API Preview 6修复了此问题。

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