serviço RESTful WCF que pode responder tanto em JSON (P) e XML e ainda ser usado como serviço web SOAP?
Pergunta
Dado um contrato, tais como:
[ServiceContract] public interface IService
{
[OperationContract]
[WebGet(UriTemplate = "GetData/{id}.{format}")]
ResponseData GetData(string id, string format);
}
Existe uma maneira de obter o serviço de responder com JSON, quando solicitado como: /GetData/1234.json, xml, quando solicitado como /GetData/1234.xml e ainda estar disponível como um serviço de sabão adequada em algum outro url, com um contrato de wsdl fortemente tipado?
Usando um Stream como o valor de retorno para GetData não é viável, como se fufills os dois primeiros requisitos, o WCF não pode criar uma especificação WSDL completo como ele não tem idéia do que o conteúdo do fluxo resultante será.
Solução
Você deve tem dois métodos distintos que levam id e formato (e eles chamariam uma implementação compartilhada que retorna ResponseData
) que têm diferentes atributos 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);
}
Para o ponto final SOAP, você deve ser capaz de chamar qualquer método, mas você vai ter que ter um separado ServiceHost
instância que hospeda a execução do contrato.