为WCF生成的代理创建消息合同

时间:2013-02-22 20:41:59

标签: wcf proxy

我正在我的项目中使用WCF服务,我已使用“添加服务引用...”添加了引用。我希望它能够生成一个带有ServiceClient实体和接口的干净代理。相反,我看到它为每个OperationContract方法创建了一个MethodNameRequest,MethodNameRequestBody,MethodNameResponse,MethodNameResponseBody实体。

因此,在调用服务方法时,代理将MethodNameRequest的实例传递给service方法,并将方法的输入参数作为RequestBody的属性。请参阅下面的一个调用AboutInformationGet()方法的示例,该方法不接受任何参数。

        public WCFDynamicInvocation.PostingService.AboutModel AboutInformationGet() {
        WCFDynamicInvocation.PostingService.AboutInformationGetRequest inValue = new WCFDynamicInvocation.PostingService.AboutInformationGetRequest();
        inValue.Body = new WCFDynamicInvocation.PostingService.AboutInformationGetRequestBody();
        WCFDynamicInvocation.PostingService.AboutInformationGetResponse retVal = ((WCFDynamicInvocation.PostingService.IMIGQPosting)(this)).AboutInformationGet(inValue);
        return retVal.Body.AboutInformationGetResult;
    }

我相信这种行为是人们期望在Webservice Proxy中看到的。因此我怀疑WCF服务配置不正确。

这里有人遇到过这个问题吗?在服务上要做的改变是什么,以便生成的代理类似于WCF服务。

干杯。

2 个答案:

答案 0 :(得分:0)

有一个类似的帖子here

右键点击您的服务参考 - >配置服务参考... - >检查是否选中“始终生成邮件合同”复选框。取消选中它并单击“确定”以重新生成代理,以查看是否获得了正常的代理。

答案 1 :(得分:0)

经过一段时间的努力,我终于发现代理中邮件合同的原因是服务接口具有以下属性:

[XmlSerializerFormat(Use = OperationFormatUse.Literal, Style = OperationFormatStyle.Document)]

据我所知,我可以用以下属性修饰DataContracts以避免包装     [MessageContract(IsWrapped = false)]

但响应仍然被包装,因为OperationContract尚未被修改。

由于没有特别需要使用XMLSerializer代替WCF的默认DataContractSerializer,我们将删除XmlSeralizerFormat装饰。