Service RESTful WCF pouvant répondre à la fois en JSON (P) et en XML tout en restant utilisé comme service Web SOAP?
Question
Compte tenu d'un contrat tel que:
[ServiceContract] public interface IService
{
[OperationContract]
[WebGet(UriTemplate = "GetData/{id}.{format}")]
ResponseData GetData(string id, string format);
}
Existe-t-il un moyen de faire en sorte que le service réponde avec json à la demande: /GetData/1234.json, xml lorsque demandé sous la forme /GetData/1234.xml et toujours disponible en tant que service soap approprié dans une autre url, avec un contrat WSDL fortement typé?
L'utilisation d'un flux en tant que valeur de retour pour GetData n'est pas réalisable, car si elle remplit les deux premières exigences, wcf ne peut pas créer de spécification wsdl complète car il n'a aucune idée du contenu du flux résultant.
La solution
Vous devriez disposer de deux méthodes distinctes qui prennent l'identifiant et le format (et appellent une implémentation partagée renvoyant ResponseData ??code>) qui ont des
attributs WebGet
:
[ServiceContract]
public interface IService
{
[OperationContract]
[WebGet(UriTemplate = "GetData/{id}.{format}.xml",
ResponseFormat=WebMessageFormat.Xml)]
ResponseData GetDataXml(string id, string format);
[OperationContract]
[WebGet(UriTemplate = "GetData/{id}.{format}.json",
ResponseFormat=WebMessageFormat.Json)]
ResponseData GetDataJson(string id, string format);
}
Pour le point de terminaison SOAP, vous devriez pouvoir appeler l'une ou l'autre méthode, mais vous devrez disposer d'un ServiceHost
hébergeant la mise en œuvre du contrat.