有时,添加WCF服务引用会生成一个空的reference.cs

Mat*_*att 157 .net c# wcf

有时添加WCF服务引用会生成一个空的reference.cs,我无法在项目的任何位置引用该服务.

有没有遇到过这个?

And*_*mes 373

一般来说,我发现它是一个代码生成问题,大部分时间都是因为我有一个无法解决的类型名称冲突.

如果右键单击服务引用并单击"配置"并取消选中 "重用参考程序集中的类型",则可能会解决该问题.

如果您使用此功能的某些方面,则可能需要确保清除名称.

  • 令人难以置信的是,即使6年后,我每周平均得到50分.来吧MS,解决这个问题.至少在开发人员不好的时候给开发人员一些反馈,而不是让他们盯着空白文件. (23认同)
  • 当它发生在我身上时,我发现我还需要将Collection Type从ObjectModel.ObservableCollection更改为Generic.List (5认同)
  • 发生在我身上,因为我加入了部分课程. (2认同)
  • 但是,如果您想使用特定组件中的类型,您可以只选择该组件,它也可以正常工作(至少在我的情况下),ta (2认同)
  • 9 年后,您仍在提供帮助。谢谢你! (2认同)

dbl*_*ood 38

正如接受的答案所指出的,重用类型时的类型引用问题可能是罪魁祸首.我发现当你无法轻易确定问题时,使用svcutil.exe命令行将帮助你揭示潜在的问题(正如John Saunders指出的那样).

这里的增强是一个使用svcutil的快速示例.

svcutil /t:code https://secure.myserver.com/services/MyService.svc /d:test /r:"C:\MyCode\MyAssembly\bin\debug\MyAssembly.dll"
Run Code Online (Sandbox Code Playgroud)

哪里:

  • / t:代码从给定的url生成代码
  • / d:指定输出的目录
  • / r:指定引用程序集

这里有完整的svcutil命令行参考:http://msdn.microsoft.com/en-us/library/aa347733.aspx

运行svcutil之后,您应该会看到导入引发的异常.您可能会收到有关您的某种类型的此类消息:"由于引用的类型与导入的DataContract不匹配,因此无法使用引用的类型".

这可以简单地指定,因为引用的程序集中的一个类型与服务的DataContract中生成的类型存在差异.在我的例子中,我导入的服务具有更新的,更新的类型,来自我在共享程序集中的类型.这一点并不明显,因为例外中提到的类型似乎是相同的.不同的是该类型使用的嵌套复杂类型之一.

还有其他更复杂的方案可能会触发此类异常并导致空白的reference.cs.这是一个例子.

如果您遇到此问题且未在数据协定中使用泛型类型,也未使用IsReference = true,那么我建议您确认您的共享类型在客户端和服务器上完全相同.否则,您可能会遇到此问题.


小智 12

对于这个确切的问题,我一直在抨击我一整天.我刚修好了.这是如何做...

该服务必须通过SSL运行(即它位于https://mydomain.com/MyService.svc)

在开发服务器上添加服务引用到WCF服务工作得很好.

在实时生产服务器上部署完全相同的WCF服务版本,然后切换到客户端应用程序并配置服务引用以指向实时服务显示没有错误,但应用程序将无法构建:事实证明服务引用是Reference.cs文件完全是空的!更新服务引用没有任何区别.清洁解决方案没有帮助.重启VS2010没有任何区别.创建新的空白解决方案,启动控制台项目并向实时服务添加服务引用表现出完全相同的问题.

我不认为这是由于冲突的类型或任何东西,但是到底是什么 - 我通过取消选中"在所有引用的程序集中重用类型"来重新配置WCF服务引用.没有快乐; 我把复选标记放回去.

下一步是在参考URL上尝试svcutil,看看是否有助于发现问题.这是命令:

svcutil /t:code https://mydomain.com/MyService.svc /d:D:\test
Run Code Online (Sandbox Code Playgroud)

这产生了以下结果:

Microsoft (R) Service Model Metadata Tool
[Microsoft (R) Windows (R) Communication Foundation, Version 4.0.30319.1]
Copyright (c) Microsoft Corporation.  All rights reserved.

Attempting to download metadata from 'https://mydomain.com/MyService.svc' using WS-Metadata Exchange or DISCO.
Error: Cannot import wsdl:portType
Detail: An exception was thrown while running a WSDL import extension: System.ServiceModel.Description.DataContractSerializerMessageContractImporter
Error: Schema with target namespace 'http://mynamespace.com//' could not be found.
XPath to Error Source: //wsdl:definitions[@targetNamespace='http://mynamespace.com//']/wsdl:portType[@name='IMyService']


Error: 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://mynamespace.com//']/wsdl:portType[@name='IMyService']
XPath to Error Source: //wsdl:definitions[@targetNamespace='http://tempuri.org/']/wsdl:binding[@name='WSHttpBinding_IMyService']


Error: Cannot import wsdl:port
Detail: There was an error importing a wsdl:binding that the wsdl:port is dependent on.
XPath to wsdl:binding: //wsdl:definitions[@targetNamespace='http://tempuri.org/']/wsdl:binding[@name='WSHttpBinding_IMyService']
XPath to Error Source: //wsdl:definitions[@targetNamespace='http://tempuri.org/']/wsdl:service[@name='MyService']/wsdl:port[@name='WSHttpBinding_IMyService']


Generating files...
Warning: No code was generated.
If you were trying to generate a client, this could be because the metadata documents did not contain any valid contracts or services
or because all contracts/services were discovered to exist in /reference assemblies. Verify that you passed all the metadata documents to the tool.

Warning: If you would like to generate data contracts from schemas make sure to use the /dataContractOnly option.
Run Code Online (Sandbox Code Playgroud)

那让我完全难过.尽管谷歌搜索量很大,并且真正相当交叉,并重新考虑作为公交车司机的职业生涯,但我终于考虑了为什么它在开发盒上运行良好.可能是IIS配置问题?

我同时远程进入开发和活动框,并在每个我启动IIS管理器(运行IIS 7.5).接下来,我浏览了每个盒子上的每个配置设置,比较每个服务器上的值.

并且存在问题:在站点的"SSL设置"下,确保选中"要求SSL",并选中"客户端证书"单选按钮以"接受".问题解决了!


Joh*_*ers 10

发生这种情况时,请查看"错误"窗口和"输出"窗口以查看是否存在任何错误消息.如果这没有帮助,请尝试svcutil.exe手动运行,并查看是否有任何错误消息.

  • 不确定微软是否已经阅读了这篇文章,但即使只是显示一个消息框,说明错误和警告,而不是只是默默地将它们放在(在我的情况下最小化)错误列表窗口中,所以我不需要谷歌这个。或者,我想当有新的警告/错误时,让标签显示为红色或黄色会很有用吗? (2认同)

小智 5

我发现,无论何时添加引用,删除引用,然后重新添加具有相同名称的服务,这种情况都会普遍发生。类型冲突似乎是由于旧文件仍然保留在Visual Studio仍可以看到的地方引起的。为了解决这个问题,在添加新参考之前,我需要做的很干净。

  1. 删除有问题的服务参考。
  2. 解决方案资源管理器中单击项目名称以突出显示该项目。
  3. 右键单击项目参考。
  4. 在上下文列表顶部附近,单击“ 清理”项。
  5. 照常添加服务参考。

希望这可以帮助。