WCF 4.0 Rest服务设置内容类型

时间:2011-01-27 21:38:41

标签: xml wcf json content-type

我刚刚完成了我的第一个WCF 4.0 Rest服务,并且不明白为什么返回的数据的Content-Type在通过Fiddler和Firefox调用服务之间发生变化。这是我的服务合同:

[ServiceContract]
public interface IProjectService
{
    [OperationContract]
    [WebGet(UriTemplate = "project/{id}/json", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json)]
    ProjectDataContract GetProjectJson(string id);

    [OperationContract]
    [WebGet(UriTemplate = "project/{id}/xml", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Xml)]
    ProjectDataContract GetProjectXml(string id);

    [OperationContract]
    [WebGet(UriTemplate = "userprojects/{userKey}/json", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json)]
    List<ProjectDataContract> GetProjectsByUserJson(string userKey);

    [OperationContract]
    [WebGet(UriTemplate = "userprojects/{userKey}/xml", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Xml)]
    List<ProjectDataContract> GetProjectsByUserXml(string userKey);
}

如您所见,我正在为每个操作设置响应格式。如果请求以“/ json”结尾,那么我将返回json数据。如果请求以“/ xml”结尾,则返回xml数据。至少这就是我的意图。

当我在Firefox中调用http://localhost:5050/ProjectServiceLibrary/project/27/xml时,我可以看到内容类型设置为“text / html”,而fiddler中调用的相同请求显示正确的内容类型“application / xml” 。调用“/ json”后缀请求 - firefox中的“text / html”和fiddler中的“application / json”也是如此。

那么,为什么会这样呢?我信任哪一个?我下载了JSONView Firefox附加组件,但这使得一切看起来像json。它将XML视为JSON。

我确定我错过了一些明显的东西。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:3)

这与客户端发送的请求中的Accept标头有关。 Accept标头包含MIME类型的优先级列表。 Accept标头由客户端(Firefox,Fiddler)定义,并告诉服务器它能够接收哪些内容类型。服务器将根据优先级和兼容性使用最佳匹配。

接受FireFox生成的标头为text / html提供更高的优先级 - 告诉服务器如果可能的话发送text / html。你可能会发现Fiddler做了相反的事情,给予application / xml更高的优先级 - 这解释了你所看到的。

有关Kris Jordans blog上的请求标头的详细信息。