首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用MessageContract时,Webservice响应被转换为ref参数。

使用MessageContract时,Webservice响应被转换为ref参数。
EN

Stack Overflow用户
提问于 2010-03-03 17:39:58
回答 2查看 881关注 0票数 2

我定义了以下接口

代码语言:javascript
复制
[ServiceContract]
public interface IHealthProducts
{
    [OperationContract()]
    ResponseClass OrderSelfSignedHealthCertificate();
}

返回以下类型

代码语言:javascript
复制
[MessageContract]
public class ResponseClass
{
    [MessageBodyMember]
    public string AnimalSpeciesCode
    {
        get;
        set;
    }

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

我预期生成的客户端代码将以以下方式公开OrderSelfSignedHealthCertificate方法:

代码语言:javascript
复制
HealthProductsClient client = new HealthProductsClient();
ResponseClass response = client.OrderSelfSignedHealthCertificate();

相反,ResponseClass的属性不是包装在ResponseClass中,而是按如下方式公开的:

代码语言:javascript
复制
string OrderSelfSignedHealthCertificate(out int VBN)

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

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

任何帮助都非常感谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-03-03 18:03:55

当您的[MessageContract]包含多个[MessageBodyMember]时,WCF将返回第一个[MessageBodyMember]作为服务调用的返回值(在您的示例中为AnimalSpeciesCode),所有其他[MessageBodyMember]都作为outref参数返回。

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

代码语言:javascript
复制
[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
EN

Stack Overflow用户

发布于 2010-03-05 08:25:13

谢谢马克就这样了。我创建了一个通用的ResponseWrapper类来封装返回类型:

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

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

代码语言:javascript
复制
ResponseWrapper<ResponseClass> OrderSelfSignedHealthCertificate();

在我的客户端代码中,这个转换为

代码语言:javascript
复制
ResponseClass OrderSelfSignedHealthCertificate(); 

这正是我想要的。谢谢!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2373564

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档