У меня возникла проблема с использованием REST и возвращаемого ответа в виде XML. Я создал базовый сервис из шаблона, и все выглядит хорошо, но когда я хочу сериализовать свой класс и вернуть его в качестве ответа, служба возвращает что-то еще.Сериализация в XML с использованием REST и WCF
Посмотрите:
[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
не был запущен. [XmlSerializerFormat]
необходимо установить сразу после [OperationContract]
, чтобы переустановить значение по умолчанию DataContractSerializer
.
marc_s: спасибо, это один из способов достижения этого. Но что делать, если я хотел бы сериализовать большой объект, содержащий другие объекты. В этом решении у меня нет возможностей сериализатора .. или я не прав? – Wodzu
уверен! Вы можете иметь свой класс 'q_order_status' и просто вручную создавать экземпляр XmlSerializer и сериализовать объект этого типа в строку и возвращать его как XElement. Это должно работать нормально. –
Спасибо за подсказку. Мне нужно больше узнать о LINQ. – Wodzu