我定义了以下接口
[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头中。
我做错了什么吗?这是正常行为吗?在使用ResponseClass时,如何获得MessageContract返回类型?
任何帮助都非常感谢。
发布于 2010-03-03 18:03:55
当您的[MessageContract]包含多个[MessageBodyMember]时,WCF将返回第一个[MessageBodyMember]作为服务调用的返回值(在您的示例中为AnimalSpeciesCode),所有其他[MessageBodyMember]都作为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-05 08:25:13
谢谢马克就这样了。我创建了一个通用的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(); 这正是我想要的。谢谢!
https://stackoverflow.com/questions/2373564
复制相似问题