访问访问我的 WCF 服务的 WSDL 时出错:“... 操作引用了一个消息元素 ... 已经从 ... 中导出”
Posted
技术标签:
【中文标题】访问访问我的 WCF 服务的 WSDL 时出错:“... 操作引用了一个消息元素 ... 已经从 ... 中导出”【英文标题】:Error when accessing access the WSDL of my WCF services: "The ... operation references a message element … that has already been exported from the …" 【发布时间】:2011-01-07 16:09:49 【问题描述】:当我在网络浏览器中访问我的网络服务时,我遇到了一种奇怪的行为,它在生成时导致了异常。
这是我的场景:
访问网页:http://localhost:10100/WCFService1.svc?wsdl
访问网页:http://localhost:10100/WCFService2.svc?wsdl
问题是 WCFService2.svc WSDL 的输出包含了 WCFService1 与 WCFService2 合并的所有定义。
此外,当我访问另一个 WSDL 时,该 WSDL 包含一个与先前生成的 WSDL 同名的方法,我得到这个异常(肯定是因为我的 WSDL 正在合并在一起)。
我还注意到合同名称有点奇怪,服务名称前有“:”:http://MyCompany.ca/:IWCFService3
有人知道“WSDL 导出扩展”是怎么回事吗?
一个异常详细信息,可能由 IncludeExceptionDetailInFaults=true, 其值为: System.InvalidOperationException:在调用 WSDL 导出扩展: System.ServiceModel.Description.DataContractSerializerOperationBehavior 合约:http://MyCompany.ca/:IWCFService3 ----> System.InvalidOperationException: MyCompany.IWCFService3.Import 操作引用消息元素 [http://MyCompany.ca/:Import] 有 已经从 MyCompany.IWCFService2.Import 手术。您可以更改名称 通过改变的操作之一 方法名称或使用 Name 属性 OperationContract 属性。 或者,您可以控制 使用更详细的元素名称 MessageContract 编程模型。 在 System.ServiceModel.Description.MessageContractExporter.AddElementToSchema(XmlSchemaElement 元素,字符串元素Ns, XmlSchemaSet schemaSet) 在 System.ServiceModel.Description.MessageContractExporter.ExportWrappedPart(消息 消息,字符串 elementName,字符串 elementNs,XmlSchemaSet schemaSet, 布尔型skipSchemaExport) 在 System.ServiceModel.Description.DataContractSerializerMessageContractExporter.ExportBody(Int32 messageIndex,对象状态) 在 System.ServiceModel.Description.MessageContractExporter.ExportMessage(Int32 messageIndex,对象状态) 在 System.ServiceModel.Description.MessageContractExporter.ExportMessageContract() 在 System.ServiceModel.Description.DataContractSerializerOperationBehavior.System.ServiceModel.Description.IWsdlExportExtension.ExportContract(WsdlExporter 出口商, WsdlContractConversionContext 合同上下文) 在 System.ServiceModel.Description.WsdlExporter.CallExtension(WsdlContractConversionContext 合同上下文,IWsdlExportExtension 扩展名)
【问题讨论】:
我建议你用两个(小)虚拟服务试试这个,重现问题,然后在这里发布代码。 【参考方案1】:我发现了我的问题:我们有大量的 Web 服务,并且我们只有一个 System.ServiceModel.Description.ServiceMetadataBehavior 实例,我们在所有服务之间共享它。为每个服务创建一个新的 ServiceMetadataBehavior 实例解决了这个问题。
【讨论】:
以上是关于访问访问我的 WCF 服务的 WSDL 时出错:“... 操作引用了一个消息元素 ... 已经从 ... 中导出”的主要内容,如果未能解决你的问题,请参考以下文章