我在我的解决方案中创建了一个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类。那是什么意思呢?为什么突然显示出来?记住:我甚至没有改变任何东西!
现在,找到了here的解决方案,但没有解释这意味着什么。所以;在服务的“配置服务引用”中,取消选中“在引用的程序集中重用类型”复选框。重建现在一切正常,没有问题。但是我真正改变了什么呢?这会对我的申请产生影响吗?什么时候应该取消选中?我确实想重用我已经设置DataContract的类型,但没有更多。我仍然可以访问那些没有经过检查的人吗?
答案 0 :(得分:149)
我在这里找到了答案:http://www.lukepuplett.com/2010/07/note-to-self-don-let-wcf-svcutil-reuse.html
长话短说:我从高级菜单中取消选中在参考程序集中重用类型。
我不知道这是否重要,但我不使用MVC,而是使用Web Forms。
答案 1 :(得分:35)
添加服务引用时,有两种方法可以处理服务使用的类型:
有很多事情可能会出错。我们发现,如果该工具崩溃,有时删除服务引用并重新开始会更快。
我们已停止使用服务参考。对于我们控制客户端和服务的项目,我们使用此screencast中描述的方法。
答案 2 :(得分:9)
今天我也有这个问题。我花了整整一天才发现自己的错误。希望它有所帮助。
我无法导入的类具有cutom枚举类型属性。此属性标记为DataMember,Enum也标记为DataContract。到目前为止一切都很好。 我忘了将每个枚举成员标记为EnumMember。
所以我改变了
[DataContract]
public enum SortMethodType
{
Default = 0,
Popularity = 1,
ReleaseDate = 2,
PublishedDate = 3,
TranslatedTitle = 4,
OriginalTitle = 5,
UserRating = 6,
Duration = 7
}
对此:
[DataContract]
public enum SortMethodType
{
[EnumMember]
Default = 0,
[EnumMember]
Popularity = 1,
[EnumMember]
ReleaseDate = 2,
[EnumMember]
PublishedDate = 3,
[EnumMember]
TranslatedTitle = 4,
[EnumMember]
OriginalTitle = 5,
[EnumMember]
UserRating = 6,
[EnumMember]
Duration = 7
}
它终于奏效了!
答案 3 :(得分:8)
在添加引用时转到高级属性并从清单中删除“System.Window.Browser”,它解决了问题。
答案 4 :(得分:8)
这可能听起来很奇怪,但我通过删除引用,然后关闭Visual Studio,再次重新打开它,最后再次添加引用来修复它。
我认为需要重新启动自定义工具或其他东西。
答案 5 :(得分:4)
我在其他开发者计算机上运行时经常遇到此错误。虽然我在我的虚拟机中到处都是完整的管理员,但我尝试关闭Visual Studio,并以“以管理员身份运行”重新打开并且神奇地工作。
祝你好运。答案 6 :(得分:2)
将解决方案从Visual Studio(VS)2010升级到2013并将每个项目的.NET Framework从4更改为4.5.1后,我收到了警告。我关闭了VS并重新打开,警告消失了。
答案 7 :(得分:1)
关闭“引用程序集中的重用类型”的一个缺点是它可能导致模糊引用的问题。这是因为服务引用在引用.cs文件中再次创建了这些对象,并且实现该服务的代码可能是从原始命名空间引用它们。
当这种情况发生时,我发现检查“指定引用程序集中的重用类型”是有用的,它允许我选择仅具有模糊引用的那些,这样就可以快速解决问题。
希望它可以帮助别人。
答案 8 :(得分:0)
我的WCF服务接口位于程序集中,实现位于另一个程序集中,服务引用位于另一个程序集中,与服务引用的客户端分开。我在将DataContract应用到枚举后立即收到错误消息。将EnumMember应用到枚举字段后,问题就解决了。
答案 9 :(得分:0)
如果您的服务没有任何问题(例如枚举问题或其他人提及的非序列化类),请尝试使用新参考创建新项目
我正在使用Silverlight 5,我曾尝试删除并多次重新创建引用。 reference.cs
文件每次都是完全空的,自从我创建它以来已经好几年了,所以试图弄清楚服务中的变化是不可能的。
我注意到该错误包含对2.0.5.0的引用。现在我甚至不知道这是否与Silverlight版本实际相关,但它让我想到了创建一个全新的项目然后突然一切都有效。
警告2自定义工具警告:无法导入wsdl:portType详细信息:An 运行WSDL导入扩展时抛出异常: System.ServiceModel.Description.DataContractSerializerMessageContractImporter 错误:无法加载文件或程序集'System.Xml,Version = 2.0.5.0, Culture = neutral,PublicKeyToken = 7cec85d7bea7798e'或其中一个 依赖。该系统找不到指定的文件。 XPath到 错误来源:// wsdl:definitions [@targetNamespace =''] / wsdl:port 输入[@ name ='IShoppingCart']
答案 10 :(得分:0)
我正在查看我的项目,我遇到了同样的问题。原来它是WCF与网站上相同DLL的不同版本。 Web站点有一个较新版本的DLL,该服务引用了旧版本的DLL。一旦它们全部同步,一切运作良好。
答案 11 :(得分:0)
我遇到了同样的错误。我挣扎了近一天,试图找出问题所在。我的线索是VS投掷的警告。它试图对Yahoo.Yui.Compressor.dll进行某种映射,这是我几天前添加和删除的库(因为我决定不使用它)。这是令人震惊的,因为图书馆不在那里,但不知怎的,它试图引用它。
最后,我从“废纸篓”恢复此dll,然后我可以成功更新我的服务参考。
答案 12 :(得分:0)
对于将来这里的任何人,我都有同样的错误,但是由版本问题引起的,有两种不同的方式。
我有两个WCF服务和两个通过服务引用进行通信的客户端应用程序。我更新了双方的nuget包,并尝试更新服务引用并得到此错误。
删除没有帮助。不需要取消选中“重用程序集”,因为我需要重用它们 - 这就是重点。
最后,有两个不同的问题:
1)我认为第一个问题是视觉工作室缓存问题。我仔细检查了所有引用,发现没有问题,但仍然报告无法找到该文件的先前版本。我卸载了所有的nuget包,重新启动了visual studio,并重新安装了它们。更新服务参考有效。
2)第二个问题是由依赖性问题引起的。我更新了双方的nuget包,一切看起来都是正确的,但没有标记的依赖是不同步的。例如:
Package Foo v1引用Bar v1。 可以在不更新引用的情况下独立地将Foo和Bar更新为v2。 如果同时安装Foo和Bar v2,则服务引用工具将扫描Foo v2,请参阅Bar v1的引用,并因为无法找到旧版本而失败。 如果您为每个包更新dll的版本号,则只能正确报告。 Visual Studio和MSBuild在构建应用程序时没有任何问题,但是服务引用将很难用来解决所有问题。
我希望这有助于某人。