WCF Web API,Hammock和WP7 Woes

时间:2011-10-13 05:08:09

标签: windows-phone-7 wcf-web-api hammock

当我在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。

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

非常感谢任何帮助。

2 个答案:

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