Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 服务引用未生成客户端类型_.net_Wcf_Service_Reference - Fatal编程技术网

.net 服务引用未生成客户端类型

.net 服务引用未生成客户端类型,.net,wcf,service,reference,.net,Wcf,Service,Reference,我试图通过向类库中添加服务引用来使用该类库中的WCF服务。在其中一个类库中,它被正确使用,我可以访问客户机类型,以便从中生成代理。但是,在我的第二个类库中(甚至在控制台测试应用程序中),当我添加相同的服务引用时,它只公开合约操作中涉及的类型,而不公开我要生成代理的客户端类型 e、 g.端点公开了两个服务—ISvc1和ISvc2。当我在第一个类库中向这个端点添加一个服务引用时,我会得到ISvc1Client和ISvc2Client来生成代理,以便使用通过这两个契约公开的操作。除了这些客户机之外,服

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


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

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

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


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

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

您可能选择了指定引用程序集中的重用类型,但没有选择非常重要的
mscorlib

首先单击解决方案资源管理器顶部的“显示所有文件”,以便展开服务引用

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

如果没有匹配项,则右键单击服务引用并选择
配置服务引用

重要的一个是mscorlib,它是正确生成客户端所必需的。我喜欢选择
System.Xml.Linq
也可以得到像
XElement
这样的好的Linq类,而不是
xmlement


还卡住吗?
  • 提示:我总是喜欢为服务引用创建一个专用的DLL。如果您需要删除它并重新开始,它会有所帮助,并且它会偶尔避免某些鸡和蛋编译问题

  • 如果您最终得到半个References.cs文件,则可能是在“重用引用的类型”,该类型与您的数据协定不兼容。i、 e.您已经在服务器端添加了数据成员,或者更改了现有成员的签名,例如将值类型设置为可选

  • 首先,要意识到SVCUTIL将非常高兴地生成一个不完整的输出文件,即使它有问题,并且当从VisualStudio运行时,您不会得到日志文件。在资源管理器中查看预期的大小,并将其与“上次已知的好”大小进行比较

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

  • 这是在VisualStudio命令提示符中最容易做到的

  • 示例命令如下所示,请注意要从中引用类型的DLL的
    reference
    参数

    svcutil.exe/reference:bin\debug\RRStore.Sys.DLL

System.ServiceModel.Description.DataContractSerializerMessageCompactImporter 错误:引用类型“SS.Sys.ShippingRateInfo,RRStore.Sys,版本=1.0.0.0,区域性=中性,PublicKeyToken=null” 命名空间中具有数据协定名称“ShippingRateInfo” “”不能为空 已使用,因为它与导入的DataContract不匹配。需要排除 此类型来自引用的类型。 XPath到错误源://wsdl:definitions[@targetNamespace='']/wsdl:portType[@name='ISSWCF']


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

我遇到了同样的问题。原来我的项目是直接引用DLL而不是项目引用。因此,尽管我的项目有一个程序集的引用,但它是一个旧版本。一旦我更新了DLL并更新了服务引用,一切都恢复正常。

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

第1版合同

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

[DataContract(Namespace="http://www.exmample.com/v1")]
 public enum Fruits
 {
    [EnumMember]
    Apple,
    [EnumMember]
    Orange,
    [EnumMember]
    Mango
 }
我已经使用svcuti命令行实用程序解决了这个问题。 命令

我收到下面的错误消息

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这将有助于解决这个问题。

按照@Kevin的回答,我
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.
[DataContract(Namespace="http://www.exmample.com/v2")]
 public enum Fruits
 {
    [EnumMember]
    Apple,
    [EnumMember]
    Orange,
    [EnumMember]
    Mango
 }