2012-02-20 33 views
4

這是http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/94503037-9cc4-494d-88af-4e97fcb9cdcc的副本,但我沒有太多的成功在那裏獲得豐碩的答案。 :(任何毫不費力地創建WCF REST客戶端發佈urlformatted請求?

我一直在試圖找到自ChannelFactory得到一個很好的具體REST服務客戶端(代理)的信息。

至於我已經想通了,你可以設置客戶端界面上attirubtes那告訴WCF使用XML(DataContract或XmlSerialization)或JSON作爲響應,以及URL格式的HTTP獲取請求或XML/JSON的HTTP post。[編輯]當然也可以通過編程或通過配置提供不同的綁定配置。從原始]

我想要的是在服務接口上的一些屬性告訴WCF創建一個URL格式的POST,沒有XML頭,然後得到一個響應我XML。 (舉例來說) [由原來編輯]和/或提供BCL綁定支持follosing [由原來/編輯]

哆啦A夢的情況是這樣的:

public interface IRestClient 
{ 
    [WebInvoke] 
    AuthResponse Authorize(
     [HeaderParameter] 
     string someHeader, 
     string someData, 
     int someInt) 
} 

// ... 

var client = channelFactory.CreateChannel<IRestClient>(); // whatever bindings I'd need for this 

var response = client.Authorize("abc", "def", 123); 

而且具有client.Authorize實際上做

HTTP POST /authorize 
someHeader: abc 
someData=def&someInt=123 

和反序列化

<AuthResponse> 
    <Message>Hi there!</Message> 
</AuthResponse> 

據我發現,從谷歌搜索和論壇顛覆,除非你做了大量的管道,編寫攔截器,格式化程序和上帝知道什麼,否則沒有辦法做到這一點。

WCF貢獻庫,WCF樣本等。人。是太學術了,太多管道和/或太少直觀的文件,我沒有痛苦做到這一點。 :)

任何提示,我可以找到最簡單的方法來做到這一點?

(請不要告訴我用HttpRequestWebClient,這就是爲什麼我們有ChannelFactory;!))

[更新]

糾正我,如果我錯了,但據我所知,很多所謂的REST API需要URL格式的請求,而不是Json或Xml。

基於Web的服務接口的WCF解釋反映方法定義的WebGetWebInvoke屬性,以確定如何調用「服務」上的每個「方法」。 (讓我簡單地稱它爲方法和服務)

WebInvoke屬性採用WebRequestFormat枚舉值來確定如何序列化請求。該枚舉只有Json和Xml。

似乎真的很愚蠢,這是一個枚舉,而不是一些指向格式化器/序列化工廠的指針,甚至是一個具體的說法。

所以,這個問題真的歸結爲最簡單的,最好已經實現的,覆蓋請求的序列化。

[/更新]

+1

生命太短而不能使事情複雜化。 RestSharp和ASP.NET Web API存在是有原因的。 – 2012-02-20 15:55:41

+0

這會讓生活變得更加複雜。最好在BCL中擁有它。我會看看RestSharp。我想要的是一個簡單的自定義綁定組合,它可以將其用於WCF頻道。 – 2012-02-20 16:01:23

+0

@Magnus別忘了Spring.NET REST客戶端:http://www.springframework.net/rest – bbaia 2012-02-20 18:41:17

回答

2

REST簡化版,具有元數據的標準。因此,您將不得不使用BCL中的許多客戶端REST工具包或基本HTTP API中的一個來自己推出客戶端代碼。您可以使用WebChannelFactory來定義與WebInvoke,WebGet的交互,但您必須自己編寫或獲取服務的副本。

一般在REST API中的API應該是動態發現URI中的條款資源也應該返回相關的URI,並且適用於您互動的當前狀態或資源動詞

+0

我知道REST沒有元數據。我非常樂意親自編寫接口定義,並添加WebGet和WebInvoke屬性。當涉及到請求格式時,我仍然碰壁。例如WebInvoke具有RequestFormat,但WebMessageFormat枚舉只有Json和Xml。我想要UrlFormatted,我發現的唯一方法是使用自定義格式化程序創建自定義綁定。我不想這樣做,所以我正在尋找已經實施的東西。不知道WebChannelFactory的具體情況,但我認爲它是由ChannelFactory在幕後使用的? – 2012-02-23 13:30:13

+0

請參閱問題中的[更新]部分以澄清我的問題。 – 2012-02-23 13:46:07

+0

WebChannelFactory 是ChannelFactory 的一個替代實現,它在UrlTemplate等中連接端點 – 2012-02-23 14:28:55

0

確保請求迴應是你最喜歡的格式。

var client = channelFactory.CreateChannel<IRestClient>(); // whatever bindings I'd need for this 

    System.ServiceModel.Description.WebHttpBehavior behaviour = new System.ServiceModel.Description.WebHttpBehavior(); 
    behaviour.DefaultOutgoingRequestFormat = System.ServiceModel.Web.WebMessageFormat.Json; 
    behaviour.DefaultOutgoingResponseFormat = System.ServiceModel.Web.WebMessageFormat.Json; 
    client.Endpoint.Behaviors.Add(behaviour); 
    m_Proxy = client.CreateChannel(); 


var response = m_Proxy.Authorize("abc", "def", 123);