我刚刚完成了我的第一个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。
我确定我错过了一些明显的东西。任何帮助将不胜感激。
答案 0 :(得分:3)
这与客户端发送的请求中的Accept标头有关。 Accept标头包含MIME类型的优先级列表。 Accept标头由客户端(Firefox,Fiddler)定义,并告诉服务器它能够接收哪些内容类型。服务器将根据优先级和兼容性使用最佳匹配。
接受FireFox生成的标头为text / html提供更高的优先级 - 告诉服务器如果可能的话发送text / html。你可能会发现Fiddler做了相反的事情,给予application / xml更高的优先级 - 这解释了你所看到的。
有关Kris Jordans blog上的请求标头的详细信息。