【问题标题】:WCF 4.0 Rest Service setting content typeWCF 4.0 Rest Service 设置内容类型
【发布时间】:2011-06-16 20:52:57
【问题描述】:

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

[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”,而在提琴手中调用的同一请求显示了正确的“应用程序/xml”内容类型。调用带有“/json”后缀的请求也会发生同样的情况——firefox 中的“text/html”和 fiddler 中的“application/json”。

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

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

【问题讨论】:

    标签: xml wcf json content-type


    【解决方案1】:

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

    Accept 由 FireFox 生成的标头赋予 text/html 更高的优先级 - 告诉服务器在可能的情况下发送 text/html。您可能会发现 Fiddler 的做法恰恰相反,它赋予 application/xml 更高的优先级 - 这解释了您所看到的。

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

    【讨论】:

    • 啊哈,现在说得通了。感谢您的澄清。我只是在 Firefox 和 Fiddler 中检查 URL,以查看我的代码是否正常工作。我对不同的结果感到非常困惑,并认为肯定是我。所以,我假设如果我使用 jQuery 访问我的“/json”后缀 url,它将接收正确的 json 数据,因为我正在指定 jquery 期望的内容类型。我必须验证这一点,但根据您的回答,这是有道理的。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-18
    • 2021-10-21
    • 2012-08-17
    • 2019-04-26
    • 2011-12-24
    • 2017-03-09
    相关资源
    最近更新 更多