我在我的解决方案中创建了一个WCF服务库项目,并引用了该项目。我从类库中使用这些服务,所以除了类库之外,我的WPF应用程序项目还有引用。服务设置很简单-只改为获取异步服务函数。
一切都正常工作-直到我想更新我的服务引用。它失败了,所以我最终回滚并重试,但即使然后它也失败了!因此,即使没有对其进行任何更改,更新服务引用也会失败。为什么?!
我收到的错误消息如下:
Custom tool error: Failed to generate code for the service reference
'MyServiceReference'. Please check other error and warning messages for details.
警告信息提供了更多的信息:
Custom tool warning: Cannot import wsdl:portType
Detail: An exception was thrown while running a WSDL import extension:
System.ServiceModel.Description.DataContractSerializerMessageContractImporter
Error: List of referenced types contains more than one type with data contract name 'Patient' in
namespace 'http://schemas.datacontract.org/2004/07/MyApp.Model'. Need to exclude all but one of the
following types. Only matching types can be valid references:
"MyApp.Dashboard.MyServiceReference.Patient, Medski.Dashboard, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" (matching)
"MyApp.Model.Patient, MyApp.Model, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" (matching)
XPath to Error Source: //wsdl:definitions[@targetNamespace='http://tempuri.org/']/wsdl:portType[@name='ISomeService']
还有两个类似的警告,内容如下:
Custom tool warning: Cannot import wsdl:binding
Detail: There was an error importing a wsdl:portType that the wsdl:binding is dependent on.
XPath to wsdl:portType: //wsdl:definitions[@targetNamespace='http://tempuri.org/']/wsdl:portType[@name='ISomeService']
XPath to Error Source: //wsdl:definitions[@targetNamespace='http://tempuri.org/']/wsdl:binding[@name='WSHttpBinding_ISomeService']
同样的方法也适用于:
Custom tool warning: Cannot import wsdl:port ..
我觉得这一切很令人困惑... 在客户端仪表板上,除了通过服务引用获得的类之外,我没有一个名为Patient的类。那这是什么意思?为什么它突然出现了?请记住:我甚至什么都没改过!
现在,找到了此问题的解决方案(链接),但没有解释这意味着什么。所以,在服务的“配置服务引用”中,我取消选中“重用引用程序集中的类型”复选框。现在重新构建,所有东西都工作正常,没有问题。但我真正改变了什么呢?这会影响我的应用程序吗?什么时候应该取消选中这个选项?我确实想重用我已经在DataContract上设置的类型,但不需要更多。如果没有选中这个选项,我还能访问到那些类型吗?