这个WCF错误的意思是什么:"自定义工具警告:无法导入wsdl:portType"

88

我在我的解决方案中创建了一个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上设置的类型,但不需要更多。如果没有选中这个选项,我还能访问到那些类型吗?


好的,这里有一个msdn上的简短解释(http://msdn.microsoft.com/en-us/library/bb628653.aspx)。但是,有没有人有更好的解释?这与我设置的DataContract相关吗? - stiank81
13个回答

158

2
需要重新启动VS 2012。 - George Filippakos
很感兴趣想要观看,但链接已经失效了,请分享一下如果你在其他地方有的话。 - Chris
1
在VS2013下的MVC 3项目中工作(无需重新启动)。 - Pawel Krakowiak
6
为了进行此更改,请右键单击使用该服务引用的项目中的服务引用,然后选择“配置服务引用...”(Just for reference: To make this change, right-click on the service reference in the project that consumes it and select 'Configure Service Reference...') - GrandMasterFlush
3
"长话短说"再好不过了 :) - Ron
这正是我需要的解决方案。我正在使用第三方公司的服务引用,虽然它在他们的测试应用程序中可以工作,但在我们的生产应用程序中却无法工作。当我取消“重用类型”选项后,一切都开始正常工作了。 - Ricky

38

当您添加服务引用时,处理服务使用的类型有两种方式:

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

很多问题可能会出现。如果工具崩溃了,我们发现删除服务引用并重新开始有时更快。

我们已停止使用服务引用。对于我们控制客户端和服务的项目,我们使用这个screencast中描述的方法。


2
谢谢!我昨天确实找到了那个屏幕录像。看了一下,确实是大开眼界!一旦我把基础知识搞定,就打算转移到那种结构上。听起来你也遇到了我看到的一些问题。当某些奇怪的事情发生时,我经常会不停地删除和重新添加服务引用,这不是好兆头......希望所描述的架构能够有所帮助! - stiank81
有人能够手写使用Silverlight 5的PollingDuplex绑定编写Web服务吗? - Richard B

10

今天我也遇到了这个问题。花了一整天的时间才找到我的错误。希望它能有所帮助。

我的类无法导入,其中包含一个自定义枚举类型属性。该属性标记为DataMember,并且枚举类型也被标记为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

8
这可能听起来很奇怪,但是我通过删除引用,关闭Visual Studio,重新打开它,最后再添加引用来解决了问题。我认为自定义工具需要重新启动或做其它处理。

2
即使您决定在不删除引用的情况下解决问题,我强烈建议您创建一个新项目并添加引用以查看是否有效。这可能会揭示您现有项目中未发现的错误,或者它可能只是起作用。 - Simon_Weaver

4

在我的虚拟机中,我经常遇到这个错误,但是在其他开发者的电脑上却可以正常工作。尽管我在虚拟机中是完整的管理员,但我尝试关闭Visual Studio,并使用“以管理员身份运行”重新打开,它就神奇地起作用了。

祝好运。


4

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


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

2

关闭“在引用的程序集中重用类型”功能的一个缺点是可能会导致模糊引用问题。这是由于服务引用在引用的 .cs 文件中创建了那些对象,而您的代码实现可能从原始命名空间引用它们。

当出现这种情况时,我发现检查“在指定的引用程序集中重用类型”很有用,这样我就可以选择仅具有模糊引用的程序集,以此快速解决问题。

希望能帮助其他人。


0

对于未来的任何人,我遇到了相同的错误,但是由于版本问题,有两种不同的方式导致。

我有两个WCF服务和两个客户端应用程序,通过服务引用进行通信。我在两侧更新了一个nuget包并尝试更新服务引用,结果出现了这个错误。

删除没有帮助。取消选中“重用程序集”不是期望的操作,因为我需要重用它们 - 这就是整个目的。

最终,存在两个单独的问题:

1)我认为第一个问题是Visual Studio缓存问题。我仔细检查了所有引用,没有发现问题,但它仍然报告找不到文件的先前版本。我卸载了所有nuget包,重新启动了Visual Studio,并重新安装了它们。更新服务引用成功。

2)第二个问题是由依赖关系问题引起的。我在两侧更新了nuget包,一切似乎都正确,但未标记的依赖项不同步。例如:

Foo v1包引用了Bar v1。 可以独立更新Foo和Bar到v2版本而不更新引用。 如果同时安装Foo和Bar v2,服务引用工具将扫描Foo v2,看到对Bar v1的引用,并失败,因为它找不到旧版本。 只有在每个包的dll版本号更新时才能正确报告此问题。 Visual Studio和MSBuild构建应用程序没有问题,但服务引用将尝试解决所有问题。

希望这能帮助到某些人。


0

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

最后,我从垃圾箱中恢复了这个dll,然后我就可以成功更新我的服务引用了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接