2

我已经定义了以下接口

[ServiceContract]
public interface IHealthProducts
{
    [OperationContract()]
    ResponseClass OrderSelfSignedHealthCertificate();
}

返回以下类型

[MessageContract]
public class ResponseClass
{
    [MessageBodyMember]
    public string AnimalSpeciesCode
    {
        get;
        set;
    }

    [MessageBodyMember]
    public int VBN
    {
        get;
        set;
    }
}

我希望生成的客户端代码会通过以下方式公开 OrderSelfSignedHealthCertificate 方法:

HealthProductsClient client = new HealthProductsClient();
ResponseClass response = client.OrderSelfSignedHealthCertificate();

相反,ResponseClass的属性没有包装在 ResponseClass 中,而是像这样公开:

string OrderSelfSignedHealthCertificate(out int VBN)

当我将 MessageContract 交换为 DataContract 属性并将 MessageBodyMember 交换为 DataMember 属性时,我得到了预期的行为(ResponseClass 响应类型)。但是,我需要 MessageContract,因为我需要将一些属性放在 SOAP 标头中。

难道我做错了什么?这是正常行为吗?使用 MessageContract 时如何获得ResponseClass返回类型?

非常感谢任何帮助。

4

2 回答 2

1

当您[MessageContract]包含多个时[MessageBodyMember],WCF 将返回第一个作为服务调用的返回值(AnimalSpeciesCode在您的情况下),并且所有其他都作为out或参数返回ref

你可以通过[MessageBodyMember]在你的消息合约中只包含一个封装你需要返回的所有项目来解决这个问题,如下所示:

[DataContract]
class CompoundData
{
    public string AnimalSpeciesCode { get; set; }
    public int VBN { get; set; }
}

[MessageContract]
public class ResponseClass
{
    [MessageBodyMember]
    public CompoundData Payload { get; set; }
}

在这种情况下,CompoundData应该是您的服务调用的返回值 - 包含您需要的两个元素。

于 2010-03-03T18:03:55.510 回答
1

谢谢马克,做到了。我制作了一个通用的 ResponseWrapper 类来封装返回类型:

[MessageContract(WrapperNamespace = "http://mynamespace.com")]
public class ResponseWrapper<T>
{
    [MessageBodyMember(Namespace = "http://mynamespace.com")]
    public T Response
    {
        get;
        set;
    }
}

我已将 OrderSelfSignedHealthCertificate 的返回类型定义为

ResponseWrapper<ResponseClass> OrderSelfSignedHealthCertificate();

在我的客户代码中,这转化为

ResponseClass OrderSelfSignedHealthCertificate(); 

这就是我想要的。谢谢!

于 2010-03-05T08:25:13.623 回答