您可能已选择了
在指定的引用程序集中重用类型
,但未选择非常重要的
mscorlib
库。
首先,在解决方案资源管理器顶部单击“显示所有文件”,以便您可以展开服务引用。
找到
Reference.cs
文件并打开它。在源代码中搜索
ClientBase
,以确保您确实没有生成意外名称的客户端。如果找到它,那就是您的服务客户端的名称。
如果没有找到匹配项,则右键单击服务引用并选择
配置服务引用
。
重要的一个是
mscorlib
,它需要正确生成客户端。我喜欢选择
System.Xml.Linq
,也可以获得漂亮的Linq类,如
XElement
而不是
XmlElement
。
仍然卡住了吗?
提示:我总是更喜欢为服务引用创建一个专用的DLL。如果您需要清除它并重新开始,这可以帮助您,而且可以避免某些鸡和蛋编译问题。
如果最终只有一半的
References.cs
文件,则您可能正在“重用引用的类型”,但这些类型与您的数据契约不兼容。即您已在服务器端添加了数据成员,或者更改了现有成员的签名,例如使值类型可选。
首先,要意识到SVCUTIL即使存在问题也会愉快地生成不完整的输出文件,并且在从Visual Studio运行时您不会得到日志文件。在资源管理器中注意预期大小并将其与“上次已知的良好大小”进行比较。
尝试直接从批处理文件中运行SVCUTIL.EXE(记得保存此文件以供下次使用)
这在Visual Studio命令提示符中最容易完成。
示例命令如下,请注意
reference
参数是引用类型的DLL。
svcutil.exe
http://dev.example.com/SSWPF.Web/Services/SS.svc /reference:bin\debug\RRStore.Sys.DLL
Detail: An exception was thrown while running a WSDL import extension:
System.ServiceModel.Description.DataContractSerializerMessageContractImporter 错误:在命名空间 'http://schemas.datacontract.org/2004/07/SS.Sys' 中,具有数据契约名称 'ShippingRateInfo' 的引用类型 'SS.Sys.ShippingRateInfo, RRStore.Sys, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' 无法使用,因为它与导入的 DataContract 不匹配。需要从引用类型中排除此类型。
XPath 错误源://wsdl:definitions[@targetNamespace='http://tempuri.org/']/wsdl:portType[@name='ISSWCF']
幸运的是,这里的答案很简单,我的类型 ShippingRateInfo
发生了改变,但我没有更新它。一旦我从服务器复制了这个类型,一切都编译得很好(我选择回退到 VS 工具)。