2010-01-20 19 views
1

我想要做的是,看似簡單:通過請求正文發送一些POX,讓WCF服務處理它,並返回201狀態碼。在我的服務合同中,我定義了以下方法:在WCF ReSTful服務中,POST或PUT請求的內容類型是否需要爲「application/x-www-form-urlencoded」?

[WebInvoke(Method = "PUT", UriTemplate = "/content/add", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Xml, RequestFormat=WebMessageFormat.Xml)] 
    [OperationContract] 
    Stream AddContent(Stream input); 

這裏的動詞沒有關係;我可以很容易地用'POST'替換'PUT',並以相同的結果結束。上述方法的實現如下:

public Stream AddContent(Stream input) 
    { 
     WebOperationContext.Current.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.Created; 
    } 

由於這種方法實際上做的是無關緊要的我省略了所有的程序代碼。爲了測試這個功能,我發射了小提琴手,並發表瞭如下要求:

User-Agent: Fiddler 
Host: myhost.com 
Content-Length: 771 
Content-Type: text/xml && application/xml; charset: utf8 
<xmlDataGoesHere></xmlDataGoesHere> 

的內容類型提供的值是不正確的,我知道,我只是用它來說明,我已經嘗試過的Content-Type的。如果我點擊Fiddler中的'執行',我的服務中的響應代碼是400錯誤請求。值得注意的是,我的服務方法實際上並沒有在這個secnario中受​​到攻擊,請求在它到達之前就已經死亡。因此,大量豐富消除的閱讀和過程後,我改變了內容類型到:

Content-Type: application/x-www-form-urlencoded 

如果我現在執行的提琴手要求從我的服務返回的狀態代碼是201創建。有什麼我想我爲什麼不能將Content-Type設置爲URLEncoded以外的任何東西?我曾嘗試調整ServiceContract中的BodyStyle和RequestFormat屬性,但這些屬性對結果沒有任何影響。任何人都可以闡明爲什麼會發生這種情況?

回答

0

好,我已經想通了這一點,我遇到的問題是「設計」。我找到了'WCF'Raw'編程模型' - 接收任意數據'在http://blogs.msdn.com/carlosfigueira/這導致瞭解決方案。這裏的解決方案是創建我自己的customBinding,隨着博客指出,它會一直返回原始編碼器。感謝所有的幫助。

0

我認爲這個問題是有關當您發送XML到的WebHttpBinding,它檢測到您發送XML,並試圖反序列化的事實。它忽略了您的簽名期望流的事實。有我看到的解決方法,但目前我找不到鏈接。如果我找到他們,我會更新帖子。

看看這個http://wcfrestcontrib.codeplex.com/

+0

感謝您的回覆。但即使使用POX格式化程序,如下所示:http://wcfrestcontrib.codeplex.com/wikipage?title=De%2fserialization%20Overview&referringTitle=Home不允許我傳入text/xml作爲內容類型。此外,它還阻止了我通過application/x-www-form-urlencoded。這兩個請求都會導致400個錯誤! – dparsons 2010-01-20 18:10:32

相關問題