2011-01-27 63 views
4

我剛剛完成了我的第一個WCF 4.0 Rest服務,不明白爲什麼在通過Fiddler和Firefox調用服務之間所返回數據的內容類型發生變化。這裏是我的服務合同:WCF 4.0 Rest服務設置內容類型

[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。

我敢肯定我錯過了一些明顯的東西。任何幫助將不勝感激。

回答

3

這與客戶端發送的請求中的Accept報頭相關。 Accept頭包含一個MIME類型的優先列表。 Accept頭由客戶端(Firefox,Fiddler)定義,並告訴服務器它能夠接收哪些內容類型。服務器將根據優先級和兼容性使用最佳匹配。

由FireFox生成的接受報頭給文本/ html更高的優先級 - 告訴服務器發送文本/ html(如果可能的話)。你可能會發現Fiddler的做法相反,給予application/xml更高的優先級 - 這解釋了你所看到的。

有關於請求標頭Kris Jordans blog更詳細的信息。

+0

ahhh,現在有道理。感謝您的澄清。我只是在Firefox和Fiddler中檢查URL,看看我的代碼是否正常工作。我被不同的結果弄得很困惑,並確信它就是我。所以,我假設如果我使用jQuery來訪問我的「/ json」後綴urls,它將接收正確的json數據,因爲我指定了jquery所期望的內容類型。我將不得不驗證這一點,但根據你的回答它是有道理的。再次感謝。 –