0

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

所以我创建了我的 Web API,它在 Web 浏览器上运行得非常好。正如预期的那样,我得到了我想要的类型。但是,当我从 WP7 使用它时,Accept 标头是什么并不重要,看起来 WP7 将其替换为/并且我只返回 XML。

我知道问题不是 Hammock,因为我尝试使用 Facebook Graph API。如果我将 Accept 更改为:application/hello,则会收到错误的请求错误。但是,当我在 C# 代码中使用 WP7 执行此操作时,我绝对没有错误,并且无论我发送什么,返回类型都是 XML。

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

如你所见,我现在在拉拉地。

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

非常感谢任何帮助。

4

2 回答 2

1

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

更新:这已在 nuget 上使用 WCF Web API Preview 6 修复。

于 2011-10-13T05:43:03.900 回答
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
    );
}
于 2011-10-13T07:40:45.103 回答