J'ai un problème avec l'utilisation de REST et le retour de la réponse en XML. J'ai créé un service de base à partir du modèle et tout semble correct, mais lorsque je veux sérialiser ma classe et la renvoyer comme réponse, le service renvoie autre chose.
Jetez un coup d'œil :
[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"
};
}
La première méthode est celle du modèle, la seconde est la mienne. Les structures de retour ressemblent à ceci :
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;
}
Édité :
Lorsque je suis sur la page d'aide du kit REST, j'obtiens cet exemple de réponse pour les deux méthodes ce qui est faux (je ne devrais pas obtenir cela pour la deuxième méthode) :
<SampleResponseBody>
<Value>String content</Value>
</SampleResponseBody>
Quand j'appelle la première méthode comme ceci :
User-Agent: Fiddler
Host: ipv4.fiddler:4617
Content-Type: text/xml
Content-Length: 63
<SampleRequestBody>
<Data>bla bla</Data>
</SampleRequestBody>
Je reçois :
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 est ok.
Lorsque j'appelle la deuxième méthode comme ceci :
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>
Je reçois ceci :
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"/>
Et il devrait retourner une instance sérialisée en XML de la classe order_status
Qu'est-ce qui ne va pas ?
Merci d'avance.
Après l'édition : ok, le problème était que pour [OperationContract]
XmlSerializer
n'a pas été déclenché. [XmlSerializerFormat]
doit être inséré juste après le [OperationContract]
pour remplacer les valeurs par défaut DataContractSerializer
.