此WCF错误是什么意思:“自定义工具警告:无法导入wsdl:portType”


84

我在解决方案中创建了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 .. 

我发现这一切令人困惑。.除了通过服务参考获得的那类外,我在客户端仪表板上没有耐心的类。那是什么意思呢?为什么突然显示出来?记住:我什至没有改变任何东西!

现在,在这里找到了解决方案,但是没有解释这意味着什么。所以; 在服务的“配置服务引用”中,取消选中“在引用的程序集中重用类型”复选框。现在重建,一切正常,没有问题。但是我真正改变了什么?这会对我的应用程序产生影响吗?而且什么时候应该取消选中呢?我确实想重复使用已设置DataContract的类型,但仅此而已。如果未选中此选项,我仍然可以访问那些人吗?


好的,有关msdn的简短说明(msdn.microsoft.com/en-us/library/bb628653.aspx)。但是,有谁有更好的解释?这如何参考DataContract的设置?
stiank81 2009年

Answers:


37

添加服务引用时,可以通过两种方式处理服务使用的类型:

  • 类型存储在dll中,并且客户端和服务器应用程序都引用了该dll。
  • 这些类型不在客户端引用的dll中。在这种情况下,创建服务引用的工具将在references.cs文件中创建类型。

有很多事情可能出错。我们发现,如果工具崩溃,有时删除服务引用并重新启动有时会更快。

我们已停止使用服务参考。对于我们可以控制客户端和服务的项目,我们使用此截屏视频中描述的方法。


2
谢谢!我实际上找到了昨天的截屏视频。看着它,这真是大开眼界!一旦我掌握了基础知识,就打算迁移到该结构。听起来您一直在努力解决我所遇到的一些相同问题。当出现奇怪的错误时,我经常会最终删除并读取服务引用,这不是一个好兆头。.希望所描述的体系结构会有所帮助!
stiank81

在将Silverlight 5与PollingDuplex绑定一起使用时,有人能手动编写Web服务吗?
理查德B

157

我在这里找到了答案:http : //www.lukepuplett.com/2010/07/note-to-self-don-let-wcf-svcutil-reuse.html

长话短说:我没有从“高级”菜单中选中“参考程序集中的重用类型”


我不知道这是否重要,但是我没有使用MVC,而是使用Web窗体。


2
还需要重新启动VS 2012
George Filippakos

有兴趣观看,但是该链接已消失,如果您在其他地方有链接,请分享
Chris

1
在VS2013下的MVC 3项目中工作(无需重新启动)。
Pawel Krakowiak 2014年

5
+1-仅供参考:要进行更改,请在使用它的项目中右键单击服务参考,然后选择“配置服务参考...”
GrandMasterFlush 2014年

2
没有什么比“长话短说”更好了:)
罗恩(Ron)

9

我今天也有这个问题。我花了一整天才发现自己的错误。希望能帮助到你。

我的无法导入的类具有cutum枚举类型属性。此属性标记为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
}

终于成功了!


8

在添加引用的同时转到“高级”属性,然后从清单中删除“ System.Window.Browser”,这解决了该问题。


谢谢!不再使用服务引用-使用@Shiraz的答案截屏中所述的手动方法。但这还是很高兴知道的!
stiank81 2010年

8

听起来可能很奇怪,但是我通过删除引用,然后关闭Visual Studio,然后再次将其重新打开,最后再次添加引用来解决此问题。

我认为自定义工具需要重新启动。


2
即使您决心在不删除引用的情况下解决问题,我也强烈建议您创建一个“新项目”并添加引用以查看其是否有效。这可能会揭示您在现有项目中看不到的错误,或者可能会起作用
Simon_Weaver13年

4

当它在另一台开发人员机器上运行时,我不断遇到此错误。即使我在虚拟机中到处都是管理员,我还是尝试关闭Visual Studio,然后使用“以管理员身份运行”重新打开,这确实神奇。

祝好运。


2

将解决方案从Visual Studio(VS)2010升级到2013,并将每个项目的.NET Framework从4更改为4.5.1后,我得到了警告。我关闭了VS,然后重新打开,警告消失了。


这对我有所帮助,但是我从.NET 4.5.2更改为4.6 Gaa!
Jimenemex

1

关闭“引用程序集中的重用类型”的缺点之一是,它可能导致引用不明确的问题。这是由于服务引用在引用.cs文件中再次创建了这些对象,而实现该服务的代码可能正在从原始名称空间引用它们。

当发生这种情况时,我发现检查“指定引用程序集中的重用类型”很有用,这使我可以选择仅具有不明确引用的类型,这样可以快速解决问题。

希望它可以帮助别人。


0

WCF服务的我的接口在一个程序集中,实现在另一个程序集中,而服务引用在另一个程序集中,与服务引用的客户端分开。在将DataContract应用于枚举之后,我得到了错误消息。将EnumMember应用于枚举的字段后,问题解决了。


0

如果不确定您的服务没有任何问题(例如枚举问题或其他人提到的不可序列化的类),请尝试创建一个新项目使用新引用。

我正在使用Silverlight 5,并且曾尝试多次删除和重新创建引用。的reference.cs文件每次都完全清空,而且从我创建文件以来已经过去了好几年,因此试图弄清楚服务中发生了什么更改是不可能的。

我注意到该错误包含对2.0.5.0的引用。现在,我什至不知道这是否与Silverlight版本真正相关,但是这使我想到只创建一个全新的项目,然后突然一切正常。

警告2自定义工具警告:无法导入wsdl:portType详细信息:运行WSDL导入扩展时抛出了异常:System.ServiceModel.Description.DataContractSerializerMessageContractImporter错误:无法加载文件或程序集'System.Xml,版本= 2.0.5.0,文化=中性,PublicKeyToken = 7cec85d7bea7798e'或其依赖项之一。该系统找不到指定的文件。错误的XPath来源:// wsdl:definitions [@targetNamespace =''] / wsdl:port类型[@ name ='IShoppingCart']


0

我正在查看我的项目,却遇到了同样的问题。事实证明,这是WCF与网站上同一DLL的不同版本。网站具有DLL的较新版本,并且该服务引用的是DLL的较旧版本。一旦它们全部同步,则一切运行良好。


0

我遇到了同样的错误。我奋斗了将近一天的时间,试图找出问题所在。对我来说,线索是VS抛出的警告。它试图对Yahoo.Yui.Compressor.dll(这是我几天前添加和删除的库(因为我决定不使用它))进行某种映射。令人震惊的是,因为该图书馆不存在,但它以某种方式试图引用它。

最后,我从垃圾桶中还原了该dll,然后可以成功更新服务参考。


0

对于以后在这里的任何人,我都有相同的错误,但是是由版本问题引起的,采用两种不同的方式。

我有两个WCF服务和两个通过服务引用进行通信的客户端应用程序。我在两边都更新了一个nuget程序包,并尝试更新服务参考并收到此错误。

删除无济于事。不需要取消选中“重用程序集”,因为我需要重用它们-这就是重点。

最后,有两个单独的问题:

1)我认为,第一个问题是视觉工作室缓存问题。我仔细检查了所有参考文献,没有发现任何问题,但仍然报告无法找到该文件的先前版本。我卸载了所有的nuget软件包,重新启动了Visual Studio,然后重新安装了它们。更新服务参考有效。

2)第二个问题是由依赖性问题引起的。我在两边都更新了nuget软件包,并且一切看起来都正确,但是未标记的依赖项不同步。例:

软件包Foo v1引用Bar v1。可以不更新参考将Foo和Bar独立更新到v2。如果同时安装了Foo和Bar v2,则服务参考工具将扫描Foo v2,请参阅对Bar v1的参考,但由于找不到旧版本而失败。仅当您为每个软件包更新dll的版本号时,此报告才正确报告。Visual Studio和MSBuild不会在构建应用程序时出现问题,但是服务引用将很难解决所有问题。

我希望这可以帮助别人。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.