我定义了以下接口
[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 返回类型?
非常感谢任何帮助。
答案 0 :(得分: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
应该是服务调用的返回值 - 包含您需要的两个元素。
答案 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时,通用返回类型未正确命名。