2010-09-01 46 views
0

我在傳遞複雜的對象/任何其他類型的一個問題:因爲我總是得到一個錯誤的請求...代碼如下片段:在WCF REST 4.0中發佈複雜類型/ HttpContent?

服務:

[OperationContract] 
[WebInvoke(UriTemplate = "saveXML/", Method="POST", BodyStyle= WebMessageBodyStyle.Bare)] 
bool saveXML(XElement xmlString) 
{ 
     return true; 
} 

======== =

客戶:

private HttpUrlEncodedForm frm = new HttpUrlEncodedForm(); 

frm.Add("CustomerCode", "123"); 
frm.Add("CustomerName", "Joseph"); 
frm.Add("Address", "4th Street Washington Ave. New York"); 
frm.Add("Country", "United States of America"); 

using (HttpResponseMessage response = m_RestHttpClient.Post("saveXML/", frm.CreateHttpContent())) 
{ 
    response.EnsureStatusIsSuccessful(); 
} 

或我試着這樣說:

var request = new XDocument(
       new XElement("Customer", 
       new XElement("CustomerCode", "123"), 
       new XElement("CustomerName", "Joseph"), 
       new XElement("Address", "4th Street Washington Ave. New York"), 
       new XElement("Country", "United States of America"))); 

frm.Add("body", request.ToString()); 

..這兩種方式都不起作用....這只是一個我想使用複雜類型的示例,因爲我會傳遞至少50個參數......或者如果您有任何其他建議可以隨意建議。

謝謝

最好的問候, 拉維

回答

0

服務:

[OperationContract] 
[WebInvoke(Method = "POST",BodyStyle = WebMessageBodyStyle.Bare, UriTemplate = "Upload", ResponseFormat= WebMessageFormat.Xml, RequestFormat= WebMessageFormat.Xml)] 
public void Upload(Stream data) 
{ 
    StreamReader reader = new StreamReader(data); 
    String res = reader.ReadToEnd(); 
} 

=========

客戶:

private HttpClient m_RestHttpClient = new HttpClient("http://localhost:17471/CustomerService/"); 


var form = new HttpUrlEncodedForm(); 
form.Add("CustomerCode", txtCustomerCode.Text); 
form.Add("CustomerName", txtCustomerName.Text); 
form.Add("ContactName", txtContactName.Text); 
form.Add("Country", txtCountry.Text); 
form.Add("PostalCode", txtPostalCode.Text); 
form.Add("ClassTemplate", txtClassTemplate.Text); 
form.Add("BusinessType", cmbBusinessType.Text); 
form.Add("IsProspect", cmbIsProspect.Text); 

using (HttpResponseMessage response = m_RestHttpClient.Post("Upload", frm.CreateHttpContent())) 
{ 
    response.EnsureStatusIsSuccessful(); 
} 

=============== ================

寫入的文本文件的輸出(通過這種方式沒有任何限制:我可以傳遞儘可能多的參數,因爲我想):

CustomerCode=CUST001&CustomerName=Customer+One&ContactName=Fuebo+Gacia&Country=France&PostalCode=8234994&ClassTemplate=Class+Template&BusinessType=Wholesale&IsProspect=True 

---基本上現在我關心的是如何獲取這些值正確我試圖傳遞一個XML字符串,但它也有不同的字符格式值也許這需要分析什麼的。 希望這可以幫助我們解決問題。

謝謝

+0

爲什麼在處理強類型對象時處理流,這使得代碼更容易處理? – 2010-09-03 11:07:06

+0

我試着用強類型對象做這個...但它不工作......如果你能告訴我一個關於如何實現這個的示例項目,我將不勝感激。我已檢查過你的博客http:// geekswithblogs。 net/michelotti/archive/2010/08/21/restful-wcf-services-with-no-svc-file-and-no-config.aspx這很有幫助,但我相信缺少的是如何用客戶端,他們沒有說明URI /操作合同/網絡調用方法。 – Ravi 2010-09-06 02:45:15

1

你傳遞的複雜類型爲的XElement - 這將會使事情變得更加複雜。只需傳遞強類型的對象。讓序列化程序爲您做好工作。另外,您將獲得自動幫助頁面,該頁面將向您顯示如何爲您的類型序列化XML。這是另一個建立WCF REST service的資源。

+0

謝謝史蒂夫,但我如何在客戶端實現這一點..讓我們說一個簡單的Windows應用程序。關於Person實體,我可以用這種方式創建它: public class Customer { public string CustomerCode; public string CustomerName; 公共字符串地址; 公共字符串國家; } 如果任何人都可以證明我如何在客戶端應用程序中實現此功能將會很有幫助。 謝謝 – Ravi 2010-09-01 10:32:35

+0

即時通訊使用WCF REST 4.0,Win App C#...基本上我只是想做一個概念驗證,其中我可以傳遞這樣的參數,而不需要與真實實體或數據庫的任何連接 – Ravi 2010-09-01 10:33:51

+0

是的,你可以創建一個看起來像只是。你將有一個更容易的時間傳遞「參數」*爲一個對象(一個長參數列表會變得很難看)。此外,codeplex上的WCF REST Starter Kits具有「將XML粘貼爲類型」,它將自動轉換爲可用作客戶端代理類的XML片段。 – 2010-09-01 11:10:14