我遇到了使用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