Cra*_*rge 26 .net service wcf reference
我试图通过添加服务引用来在类库中使用WCF服务.在其中一个类库中,它被正确使用,我可以访问客户端类型,以便从中生成代理.但是在我的第二个类库(甚至在控制台测试应用程序中),当我添加相同的服务引用时,它只公开合同操作中涉及的类型,而不是我生成代理的客户端类型.
例如,Endpoint有2个服务暴露 - ISvc1和ISvc2.当我在第一个类库中向此端点添加服务引用时,我得到ISvc1Client和f ISvc2Client来生成代理,以便使用通过这两个合同公开的操作.除了这些客户端之外,服务引用还公开了操作中涉及的类型,如(类型1,类型2等),这就是我需要的.但是,当我尝试在另一个控制台应用程序或类库中添加服务引用到同一个endpoing时,只有Type 1,Type 2等公开,而不是ISvc1Client和ISvc2Client,因为我无法生成代理来访问我需要的操作.我无法确定为什么服务引用在一个类库中正确生成而在另一个类或测试控制台应用程序中没有生成.
Sim*_*ver 47
您可能已选择Reuse types in specified reference assemblies但未选择非常重要的mscorlib库.
首先单击解决方案资源管理器顶部的"显示所有文件",以便扩展服务引用.

Reference.cs文件并将其打开.ClientBase在源代码中搜索以确保您确实没有生成具有您不期望的名称的客户端.如果您找到它,那么这就是您的服务客户端的名称.
如果没有匹配,则右键单击服务引用并选择Configure Service Reference.
重要的是mscorlib正确生成客户端所需的.我喜欢选择System.Xml.Linq也得到不错的LINQ类,如XElement不XmlElement.

提示:我总是喜欢为服务引用创建一个专用的DLL.如果您需要将其擦除并重新开始,它可以提供帮助,并且它可以偶尔避免某些鸡和蛋的编译问题.
如果你最终得到一半的References.cs文件,你可能会"重用"与你的数据合同不兼容的引用类型.即,您已在服务器端添加数据成员,或更改现有成员的签名,例如使值类型可选.
首先,意识到SVCUTIL即使遇到问题也会非常愉快地生成不完整的输出文件,并且当从Visual Studio运行时,您不会获得日志文件.密切关注Explorer中的预期尺寸,并将其与"最后的已知商品"尺寸进行比较.
尝试直接从批处理文件运行SVCUTIL.EXE(记得下次保存此文件)
这在Visual Studio命令提示符中最容易做到
示例命令如下,请注意reference您引用类型的DLL 的参数.
svcutil.exe http://dev.example.com/SSWPF.Web/Services/SS.svc /reference:bin\debug\RRStore.Sys.DLL
Run Code Online (Sandbox Code Playgroud)Detail: An exception was thrown while running a WSDL import extension:System.ServiceModel.Description.DataContractSerializerMessageContractImporter错误:引用类型'SS.Sys.ShippingRateInfo,RRStore.Sys,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null',在命名空间' http://中包含数据协定名称'ShippingRateInfo' schemas.datacontract.org/2004/07/SS.Sys '无法使用,因为它与导入的DataContract不匹配.需要从引用的类型中排除此类型.XPath到错误源:// wsdl:definitions [@ targetNamespace =' http://tempuri.org/']/wsdl:portType [@ name ='ISSWCF']
幸运的是,答案很简单,我的类型ShippingRateInfo已经改变,我没有更新它.一旦我从服务器复制了这个类型,一切编译得很好(我选择恢复到VS工具).
真正的答案是,如果您使用服务合同中的KnownTypeAttribute序列化类型,则必须在要添加服务引用的项目中包含对类型库的引用.
例如,如果您的wcf服务序列化System.Drawing.Image类型,那么使用者项目必须具有对System.Drawing的引用.希望这有助于一些人.
小智 5
由于类型不匹配,我遇到了类似的问题。因此我无法在测试项目中生成客户端。我们维护不同版本的合约,在创建新版本时我引入了类型不匹配错误。以下是我的案例中的代码场景。
版本 1 合约
[DataContract(Namespace="http://www.exmample.com/v1")]
public enum Fruits
{
[EnumMember]
Apple,
[EnumMember]
Orange
}
Run Code Online (Sandbox Code Playgroud)
第 2 版合约
[DataContract(Namespace="http://www.exmample.com/v1")]
public enum Fruits
{
[EnumMember]
Apple,
[EnumMember]
Orange,
[EnumMember]
Mango
}
Run Code Online (Sandbox Code Playgroud)
我已经使用svcutil命令行实用程序解决了这个问题。命令
svcutil MyContract.dll
Run Code Online (Sandbox Code Playgroud)
我收到以下错误消息
DataContract for type 'V2.Fruits' cannot be added to DataContractSet since type 'V1.Fruits with the same data contract name 'Fruits' in namespace 'http://www.exmample.com/v1' is already present and the contracts are not equivalent.
Run Code Online (Sandbox Code Playgroud)
我将命名空间从版本 1 更改为版本 2,并且能够在测试项目中生成服务引用。
[DataContract(Namespace="http://www.exmample.com/v2")]
public enum Fruits
{
[EnumMember]
Apple,
[EnumMember]
Orange,
[EnumMember]
Mango
}
Run Code Online (Sandbox Code Playgroud)
使用svcutil这将有助于解决此问题。