我遇到了使用REST並將響應作爲XML返回的問題。我從模板創建了基本的服務,一切看起來都很好,但是當我想序列化我的類並將其作爲響應返回時,該服務返回其他內容。使用REST和WCF序列化爲XML
請看:
[WebHelp(Comment = "Sample description for DoWork")]
[WebInvoke(UriTemplate = "DoWork")]
[OperationContract]
public SampleResponseBody DoWork(SampleRequestBody request)
{
//TODO: Change the sample implementation here
return new SampleResponseBody()
{
Value = String.Format("Sample DoWork response: '{0}'", request.Data)
};
}
[WebHelp(Comment = "Returns order state based on client and order number")]
[WebInvoke(UriTemplate = "OrderStatus")]
[OperationContract]
public order_status OrderStatus(q_order_status request)
{
return new order_status()
{
error_id = 0,
client_acr = "client",
order_acr = "order"
};
}
第一種方法是從模板,第二個是我的。 返回的結構是這樣的:
public class SampleResponseBody
{
[DataMember]
public string Value { get; set; }
}
public class q_order_status
{
public string client_acr;
public string order_acr;
}
[DataContract]
[XmlSerializerFormat]
public class order_status
{
[XmlAttribute]
public int error_id;
[XmlElement]
public string error_desc;
[XmlElement]
public string order_acr;
[XmlElement]
public string client_acr;
}
編輯:
當我的REST套件的幫助頁面上,我得到這個爲兩種方法這是錯誤的一個樣本響應 (我不應該在第二個方法可以解決):
<SampleResponseBody>
<Value>String content</Value>
</SampleResponseBody>
當我打電話第一種方法是這樣的:
User-Agent: Fiddler
Host: ipv4.fiddler:4617
Content-Type: text/xml
Content-Length: 63
<SampleRequestBody>
<Data>bla bla</Data>
</SampleRequestBody>
我收到:
HTTP/1.1 200 OK
Server: ASP.NET Development Server/9.0.0.0
Date: Wed, 30 Sep 2009 09:41:20 GMT
X-AspNet-Version: 2.0.50727
Cache-Control: private
Content-Type: application/xml; charset=utf-8
Content-Length: 141
Connection: Close
<SampleResponseBody xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><Value>Sample DoWork response: 'bla bla'</Value></SampleResponseBody>
WHIS是確定的。
當我打電話第二種方法是這樣的:
User-Agent: Fiddler
Host: ipv4.fiddler:4617
Content-Type: text/xml
Content-Length: 115
<q_order_status>
<client_acr>String content</client_acr>
<order_acr>String content</order_acr>
</q_order_status>
我得到這個:
HTTP/1.1 200 OK
Server: ASP.NET Development Server/9.0.0.0
Date: Wed, 30 Sep 2009 09:44:18 GMT
X-AspNet-Version: 2.0.50727
Cache-Control: private
Content-Type: application/xml; charset=utf-8
Content-Length: 67
Connection: Close
<order_status xmlns:i="http://www.w3.org/2001/XMLSchema-instance"/>
它應該返回一個序列化類的XML實例order_status
什麼是錯的?
在此先感謝。
後編輯:好的,問題是,[OperationContract]
XmlSerializer
未被觸發。必須在[OperationContract]
之後插入[XmlSerializerFormat]
以覆蓋默認的DataContractSerializer
。
marc_s:謝謝,這是實現這一目標的方法之一。但是如果我想序列化一些包含其他對象的大對象呢?在這個解決方案中,我沒有串行器功能..或者我錯了嗎? – Wodzu 2009-09-30 13:25:45
當然!你可以有你的'q_order_status'類,只需手動實例化一個XmlSerializer,並將該類型的對象序列化爲一個字符串並將其作爲XElement返回。這應該工作得很好。 – 2009-09-30 13:46:06
感謝您的提示。我將不得不閱讀更多關於LINQ的信息。 – Wodzu 2009-09-30 16:02:43