0

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

因此,在调用服务方法时,代理将 MethodNameRequest 实例传递给服务方法,该方法的输入参数作为 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;
    }

我相信这种行为是人们期望在 Web 服务代理中看到的。因此我怀疑 WCF 服务没有正确配置。

这里有人遇到过这个问题吗?为了使生成的代理类似于 WCF 服务,该服务需要进行哪些更改。

干杯。

4

2 回答 2

0

这里有一个类似的帖子。

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

于 2013-02-22T21:18:43.437 回答
0

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

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

据我了解,我可以使用以下属性装饰 DataContracts 以避免包装 [MessageContract(IsWrapped = false)]

但是响应仍然被包装,因为 OperationContract 没有被修改。

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

于 2013-02-25T22:48:54.577 回答