给定一个契约(Contract),例如:

[ServiceContract] public interface IService
{
    [OperationContract]
    [WebGet(UriTemplate = "GetData/{id}.{format}")]
    ResponseData GetData(string id, string format);
}

有没有一种方法可以让服务在被请求时以json响应:
/GetData/1234.json,以/GetData/1234.xml的身份被请求时,仍然可以通过强类型的wsdl契约(Contract)在其他网址作为适当的肥皂服务使用xml?

使用Stream作为GetData的返回值是不可行的,尽管它满足了前两个要求,但是wcf无法创建完整的wsdl规范,因为它不知道生成的Stream的内容是什么。

最佳答案

您应该有两个采用id和format的单独方法(它们将调用一个返回ResponseData的共享实现),它们具有不同的 WebGet attributes:

[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);
}

对于SOAP端点,您应该能够调用这两种方法,但是您将不得不拥有一个单独的 ServiceHost 实例来托管契约(Contract)的实现。

10-06 14:15
查看更多