我正在我的项目中使用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服务。
干杯。
答案 0 :(得分:0)
有一个类似的帖子here。
右键点击您的服务参考 - >配置服务参考... - >检查是否选中“始终生成邮件合同”复选框。取消选中它并单击“确定”以重新生成代理,以查看是否获得了正常的代理。
答案 1 :(得分:0)
经过一段时间的努力,我终于发现代理中邮件合同的原因是服务接口具有以下属性:
[XmlSerializerFormat(Use = OperationFormatUse.Literal, Style = OperationFormatStyle.Document)]
据我所知,我可以用以下属性修饰DataContracts以避免包装 [MessageContract(IsWrapped = false)]
但响应仍然被包装,因为OperationContract尚未被修改。
由于没有特别需要使用XMLSerializer代替WCF的默认DataContractSerializer,我们将删除XmlSeralizerFormat装饰。