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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/1872865/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-08 21:18:34  来源:igfitidea点击:

What does this WCF error mean: "Custom tool warning: Cannot import wsdl:portType"

wpfwcfservice-reference

提问by stiank81

I created a WCF service library project in my solution, and have service references to this. I use the services from a class library, so I have references from my WPF application project in addition to the class library. Services are set up straight forward - only changed to get async service functions.

我在我的解决方案中创建了一个 WCF 服务库项目,并对此有服务引用。我使用类库中的服务,因此除了类库之外,我还有来自 WPF 应用程序项目的引用。服务是直接设置的——只是为了获得异步服务功能而改变。

Everything was working fine - until I wanted to update my service references. It failed, so I eventually rolled back and retried, but it failed even then! So - updating the service references fails without doing any changes to it. Why?!

一切正常 - 直到我想更新我的服务引用。它失败了,所以我最终回滚并重试,但即使那样也失败了!所以 - 更新服务引用失败,而不对其进行任何更改。为什么?!

The error I get is this one:

我得到的错误是这个:

Custom tool error: Failed to generate code for the service reference 
'MyServiceReference'.  Please check other error and warning messages for details.   

The warning gives more information:

警告提供了更多信息:

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']

There are two similar warnings too saying:

也有两个类似的警告说:

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']  

And the same for:

同样适用于:

Custom tool warning: Cannot import wsdl:port .. 

I find this all confusing.. I don't have a Patient class on the client side Dashboard except the one I got through the service reference. So what does it mean? And why does it suddenly show? Remember: I didn't even change anything!

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

Now, the solution to this was found here, but without an explanation to what this means. So; in the "Configure service reference" for the service I uncheck the "Reuse types in the referenced assemblies" checkbox. Rebuilding now it all works fine without problems. But what did I really change? Will this make an impact on my application? And when should one uncheck this? I do want to reuse the types I've set up DataContract on, but no more. Will I still get access to those without this checked?

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

采纳答案by Shiraz Bhaiji

When you add a service reference, there are two ways the types that are used by the service can be handled:

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

  • The types are stored in a dll, and that dll is referenced from both the client and the server application.
  • The types are not in a dll referenced by the client. In that case the tool that creates the service reference, will create the types in the references.cs file.
  • 这些类型存储在一个 dll 中,并且该 dll 被客户端和服务器应用程序引用。
  • 这些类型不在客户端引用的 dll 中。在这种情况下,创建服务引用的工具将在references.cs 文件中创建类型。

There are many things that can go wrong. We have found that if the tool crashes, it is sometimes faster to delete the service reference and start again.

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

We have stopped using service reference. For projects where we have control of the client and the service, we use the method described in this screencast.

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

回答by Dragos Durlut

I found my answer here: http://www.lukepuplett.com/2010/07/note-to-self-don-let-wcf-svcutil-reuse.html

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

Long story short: I unchecked Reuse types in reference assembliesfrom the Advanced menu.

长话短说:我从Advanced menu 中取消选中Reuse types in reference assembly



I don't know if this matters but i'm not using MVC, but Web Forms.

我不知道这是否重要,但我使用的不是 MVC,而是 Web 表单。

回答by Aurel

I also had this issue Today. It took me one entire day to find my mistake. Hope it helps.

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

My class that weren't able to be imported has a cutom enum type property. This property is marked as DataMember and the Enum is also marked as DataContract. Everything fine so far. I just forgot to mark every enum member as EnumMember.

我无法导入的类具有 cutom 枚举类型属性。此属性标记为 DataMember,Enum 也标记为 DataContract。到目前为止一切都很好。我只是忘记将每个枚举成员标记为 EnumMember。

So i changed

所以我改变了

[DataContract]
public enum SortMethodType
{
    Default = 0,
    Popularity = 1,
    ReleaseDate = 2,
    PublishedDate = 3,
    TranslatedTitle = 4,
    OriginalTitle = 5,
    UserRating = 6,
    Duration = 7
}

To this:

对此:

[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
}

And it finally worked!

它终于奏效了!

回答by Sridhar Subramanian

Go to Advanced properties while adding reference and remove "System.Window.Browser" from the checklist, It solves the problem.

添加引用时转到高级属性并从清单中删除“System.Window.Browser”,它解决了问题。

回答by Ateik

that might sound weird, but I got it fixed by deleting the references, then closing Visual Studio, and reopening it again, and finally adding the references again.

这听起来可能很奇怪,但我通过删除引用来修复它,然后关闭 Visual Studio,再次重新打开它,最后再次添加引用。

I think the custom tool thing needed to be restarted or something.

我认为需要重新启动自定义工具之类的东西。

回答by Tim Gabrhel

I constantly run across this error while it works on another developers machine. Even though I'm a full admin everywhere in my virtual machine, I tried closing Visual Studio, and re-opening with 'Run As Administrator' and it magically worked.

当它在另一台开发人员机器上运行时,我经常遇到这个错误。尽管我在虚拟机中的任何地方都是完全管理员,但我尝试关闭 Visual Studio,然后使用“以管理员身份运行”重新打开,它神奇地起作用了。

Good luck.

祝你好运。

回答by Paul Berglund

I got the warning after upgrading my solution from Visual Studio (VS) 2010 to 2013 and changing each project's .NET Framework from 4 to 4.5.1. I closed VS and re-opened and the warnings went away.

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

回答by John

One downside of turning off 'reuse types in referenced assemblies' is that it can cause issues with ambiguous references. This is due to the service reference creating those objects again in the reference .cs file, and your code implementing the service may be referencing them from the original namespace.

关闭“引用程序集中的重用类型”的一个缺点是它可能会导致不明确的引用出现问题。这是因为服务引用在引用 .cs 文件中再次创建了这些对象,并且您实现服务的代码可能正在从原始命名空间引用它们。

When this scenario occurs I find it useful to check the 'reuse types in specified referenced assemblies' which allows me to choose the ones with ambiguous references only, which resolves the issue quickly that way.

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

Hope it helps someone else.

希望它可以帮助别人。

回答by cdiaz

I experienced the same error. I struggled for almost a day trying to find out what was going wrong. The clue for me were the warnings that VS was throwing. It was trying to do some kind of mapping to Yahoo.Yui.Compressor.dll, a library I had added and removed (because I decided not to use it) a couple of days before. It was shocking because the library wasn't there, but somehow it was trying to reference it.

我遇到了同样的错误。我挣扎了将近一天,试图找出出了什么问题。我的线索是 VS 抛出的警告。它试图对 Yahoo.Yui.Compressor.dll 进行某种映射,这是我几天前添加和删除的库(因为我决定不使用它)。令人震惊的是因为图书馆不在那里,但不知何故它试图引用它。

Finally, I restore this dll from the Trash, and then I could update my service reference successfully.

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

回答by TheMightyGherkin

For anyone here in the future, I had the same error but caused by version issues, in two different ways.

对于将来在这里的任何人,我都有同样的错误,但由版本问题以两种不同的方式引起。

I have two WCF services and two client applications that talk via the service references. I updated a nuget package on both sides and tried to update the service reference and got this error.

我有两个 WCF 服务和两个通过服务引用进行通信的客户端应用程序。我更新了双方的 nuget 包并尝试更新服务引用并出现此错误。

Deleting didn't help. Unchecking "reuse assemblies" is not desired as I need to reuse them - that's the whole point.

删除没有帮助。不希望取消选中“重用程序集”,因为我需要重用它们 - 这就是重点。

In the end, there were two separate issues:

最后,有两个不同的问题:

1) The first issue, I believe, was a visual studio caching issue. I meticulously went over all of the references and found no issues but it still reported being unable to find the previous version of the file. I uninstalled all of the nuget packages, restarted visual studio, and reinstalled them. Updating the service reference worked.

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

2) The second issue was caused by a dependency issue. I updated the nuget package on both sides and everything appeared correct, but an unmarked dependency was out of sync. Example:

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

Package Foo v1 references Bar v1. It is possible to update Foo and Bar to v2 independently without updating the reference. If you install both Foo and Bar v2 the service reference tool will scan Foo v2, see the reference to Bar v1, and fail because it can't find the older version. This is only reported correctly if you update the version numbers of your dll for every package. Visual Studio and MSBuild will have no problem building the application but the service reference will have a terrible time trying to resolve everything.

包 Foo v1 引用了 Bar v1。可以独立地将 Foo 和 Bar 更新到 v2,而无需更新引用。如果您同时安装 Foo 和 Bar v2,服务引用工具将扫描 Foo v2,查看对 Bar v1 的引用,但由于找不到旧版本而失败。如果您为每个包更新 dll 的版本号,这只会正确报告。Visual Studio 和 MSBuild 构建应用程序没有问题,但服务引用在尝试解决所有问题时会遇到困难。

I hope this helps someone.

我希望这可以帮助别人。