使用MessageContract时,Webservice Response将变为ref参数

时间:2010-03-03 17:39:59

标签: .net wcf soap messagecontract

我定义了以下接口

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

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

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

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:1)

当您的[MessageContract]包含多个[MessageBodyMember]时,WCF将返回第一个作为服务调用的返回值(在您的情况下为AnimalSpeciesCode),并返回所有其他值作为outref参与者。

你可以通过在你的邮件合同中只有一个[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应该是服务调用的返回值 - 包含您需要的两个元素。

答案 1 :(得分:1)

谢谢Marc,做到了。 我创建了一个通用的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(); 

这就是我想要的。谢谢!

答案 2 :(得分:0)

我已发布此问题here的后续内容。 使用MessageContract时,通用返回类型未正确命名。