服务引用不生成客户端类型

时间:2010-06-08 18:35:55

标签: .net wcf service reference

我试图通过向类库添加服务引用来在类库中使用WCF服务。在其中一个类库中,它被正确使用,我可以访问客户端类型,以便从中生成代理。但是在我的第二个类库(甚至在控制台测试应用程序中),当我添加相同的服务引用时,它只公开合同操作中涉及的类型,而不是我生成代理的客户端类型。

e.g。端点有2个服务暴露 - ISvc1和ISvc2。当我在第一个类库中向此端点添加服务引用时,我得到ISvc1Client和f ISvc2Client来生成代理,以便使用通过这两个合同公开的操作。除了这些客户端之外,服务引用还公开了操作中涉及的类型,如(类型1,类型2等),这就是我需要的。但是,当我尝试在另一个控制台应用程序或类库中添加服务引用到同一个endpoing时,只有Type 1,Type 2等公开,而不是ISvc1Client和ISvc2Client,因为我无法生成代理来访问我需要的操作。我无法确定为什么服务引用在一个类库中正确生成而在另一个类或测试控制台应用程序中没有正确生成。

7 个答案:

答案 0 :(得分:43)

您可能选择了Reuse types in specified reference assemblies但未选择非常重要的mscorlib库。

首先点击解决方案资源管理器顶部的“显示所有文件”,以便扩展服务参考。

enter image description here

  • 找到Reference.cs文件并将其打开。
  • 在源代码中搜索ClientBase,以确保您确实没有使用您不期望的名称生成客户端。如果您找到它,那么这就是您的服务客户端的名称。

enter image description here

如果没有匹配,请右键单击服务引用,然后选择Configure Service Reference

重要的是 mscorlib ,这是正确生成客户端所必需的。我也想选择System.Xml.Linq以获得不错的Linq课程,例如XElement而不是XmlElement

enter image description here


仍然卡住?

  • 提示:我总是喜欢为服务引用创建一个专用的DLL。如果您需要将其擦除并重新开始,它可以提供帮助,并且它可以在一段时间内避免某些鸡和蛋的编译问题。

  • 如果你最终得到一半的References.cs文件,你可能会“重用”与你的数据合同不兼容的引用类型。即您已在服务器端添加数据成员,或更改现有成员的签名,例如使值类型可选。

  • 首先,要意识到SVCUTIL即使遇到问题也会非常愉快地生成不完整的输出文件,并且从Visual Studio运行时,您不会获得日志文件。请密切关注预期尺寸的资源管理器,并将其与“最后已知良好”尺寸进行比较。

  • 尝试直接从批处理文件运行SVCUTIL.EXE(请记住下次保存此文件)

  • 这在Visual Studio命令提示符

  • 中最容易做到
  • 示例命令如下,请注意您引用类型的DLL的reference参数。

    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       错误:引用类型'SS.Sys.ShippingRateInfo,RRStore.Sys,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null'   在命名空间中使用数据协定名称“ShippingRateInfo”   'http://schemas.datacontract.org/2004/07/SS.Sys'不能   因为它与导入的DataContract不匹配而使用。需要排除   这种类型来自引用类型。       XPath到错误源:// wsdl:definitions [@targetNamespace ='http://tempuri.org/'] / wsdl:portType [@ name ='ISSWCF']

幸运的是,这里的答案很简单,我的类型ShippingRateInfo已经改变,我没有更新它。一旦我从服务器复制了这个类型,一切编译得很好(我选择恢复到VS工具)。

答案 1 :(得分:8)

真正的答案是,如果您使用服务合同中的KnownTypeAttribute序列化类型,则必须在要添加服务引用的项目中包含对类型库的引用。

例如,如果您的wcf服务序列化System.Drawing.Image类型,那么使用者项目必须具有对System.Drawing的引用。希望这有助于一些人。

答案 2 :(得分:2)

我遇到了同样的问题。事实证明我的项目是直接引用DLL而不是项目引用。因此,即使我的项目有一个程序集的参考,它是一个旧版本。一旦我更新了DLL并更新了服务引用,一切都恢复了。

答案 3 :(得分:2)

我遇到了类似的问题,这是由于类型不匹配造成的。因为我无法在测试项目中生成客户端。我们维护不同版本的合同,而创建新版本时我引入了类型不匹配错误。以下是我的代码场景。

第1版合同

[DataContract(Namespace="http://www.exmample.com/v1")]
public enum Fruits
{
    [EnumMember]
    Apple,
    [EnumMember]
    Orange
}

第2版合同

[DataContract(Namespace="http://www.exmample.com/v1")]
 public enum Fruits
 {
    [EnumMember]
    Apple,
    [EnumMember]
    Orange,
    [EnumMember]
    Mango
 }

我已使用 svcutil 命令行实用程序解决了此问题。 命令

svcutil MyContract.dll

我收到以下错误消息

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.

我将命名空间从版本1更改为版本2,并且我能够在测试项目中生成服务引用。

[DataContract(Namespace="http://www.exmample.com/v2")]
 public enum Fruits
 {
    [EnumMember]
    Apple,
    [EnumMember]
    Orange,
    [EnumMember]
    Mango
 }

使用 svcutil 这有助于解决此问题。

答案 4 :(得分:1)

这通常用于添加之前添加的服务引用。在客户端配置中,它仍然具有相关的服务模型。确保从客户端配置中删除servicemodel,然后再次尝试重新添加服务引用!

答案 5 :(得分:0)

根据@ Kevin的回答,我添加了对服务项目中引用的所有项目和DLL的引用。然后代理生成能够识别/生成所需的类型。

一旦完成,你甚至可以开始删除一些并重新生成以排除多余的。

答案 6 :(得分:-6)

显然,在添加服务引用之前,必须在项目中添加对System.Web的引用。这样做了。