WCF AddServiceReference 导致自定义工具错误,不产生代理

Posted

技术标签:

【中文标题】WCF AddServiceReference 导致自定义工具错误,不产生代理【英文标题】:WCF AddServiceReference causing custom tool error, not producing proxy 【发布时间】:2010-12-14 14:33:48 【问题描述】:

“添加服务引用”的问题,实际上是 SvcUtil 的所有功能问题。 为了重现,您只需添加一个带参数的 OperationContract 或返回以下类:

[XmlSchemaProvider("MySchema")]
public class MyStructure : IXmlSerializable

    private XmlElement e;

    private static void Func(object o, ValidationEventArgs args)
    
    

    public static XmlQualifiedName MySchema(XmlSchemaSet xs)
    
        //xs.XmlResolver = new XmlUrlResolver();             
        XmlSchema s = XmlSchema.Read(new XmlTextReader(new StringReader("<?xml version=\"1.0\"?><xs:schema xmlns:xs=\"http://www.w3.org/2001/XMLSchema\"><xs:complexType name=\"MyStructure\"><xs:sequence><xs:any /></xs:sequence></xs:complexType></xs:schema>")), null);

        xs.Add(s);
        return new XmlQualifiedName("MyStructure");
    

    #region IXmlSerializable Members

    public System.Xml.Schema.XmlSchema GetSchema()
    
        throw new NotImplementedException();
    

    public void ReadXml(XmlReader reader)
    
       XmlDocument doc = new XmlDocument();
       e = (XmlElement)doc.ReadNode(reader);
    

    public void WriteXml(XmlWriter writer)
    
        e.WriteTo(writer);
    

    #endregion

结果是,当您使用 AddWebReference 或 AddSerivceReference 而不引用包含 MyStructure 类型的类库时,一切都会好起来的,您将在自动创建的代理处获得 xmlElement 表示。

但是,当您有参考资料时,您会收到以下警告:

=================

警告 1 自定义工具警告:无法导入 wsdl:portType 详细信息:运行 WSDL 导入扩展时引发异常:System.ServiceModel.Description.DataContractSerializerMessageContractImporter 错误:不能使用命名空间“”中数据合同名称“MyStructure”的引用类型“ServiceLibrary.MyStructure、ServiceLibrary、Version=1.0.0.0、Culture=neutral、PublicKeyToken=null”,因为它与导入的 DataContract 不匹配。需要从引用类型中排除此类型。 错误源的 XPath: //wsdl:definitions[@targetNamespace='http://tempuri.org/']/wsdl:portType[@name='IService1'] \Projects\WCFSample\WCFExample\TestAddReference\Service References\ServiceReference1\Reference.svcmap 1 1 TestAddReference

=======================

并且不会为您生成任何代理。

现在,当您拥有通用 DataContract 和/或使用 IsReference 属性时,互联网上充斥着对此的描述。

这是一个非常严重的问题,因为任何非类型化数据都会造成这个问题。 找不到任何解决问题的方法。如果我想通过共享合约的类库来了解客户端的类型怎么办?

【问题讨论】:

我希望我知道这个问题的答案。我现在正在与 VS2010 解决一个几乎相同的问题。以我的经验,WCF 多年来一直不稳定且不可靠,因为它在 svcutil.exe 中生成适当的 WSDL 以供使用,而且在 VS2010 中尚未修复它有点令人失望。微软没有人真正使用这项技术吗?因为我无法设置 WCF 服务而不遇到此问题或其他一些密切相关的问题。 微软请解决这个问题!!! (或者我去 Java) 【参考方案1】:

这种类型的异常通常意味着与引用的类型相比,服务生成的类型协定至少存在一个差异(如消息所示!)。但正如我发现的那样,乍一看可能并不明显。确保所有嵌套和引用类型在服务器上都是最新的。就我而言,嵌套类型已在服务器上更新。我以为我已经通过本地引用的程序集(和共享引用类型)进行了更新,但我错过了一些。经过仔细检查才能找到罪魁祸首。

在this question中查看更多信息

【讨论】:

【参考方案2】:

我有一个建议: 我有类似的错误,包括:

找不到 .svcmap 文件。它可能已被移动或删除。要生成新的 .svcmap 文件,请删除服务引用并重新添加。

此时,除非我关闭 VS2010 并再次打开它,否则无法删除服务引用。

情况:我的 WCF 服务正在运行,我以编程方式在我定义的 HTTP 地址处添加了 Description.ServiceMetadataBehavior

VS2010 中,我尝试在 HTTP 地址添加服务引用,我看到了我的服务,我添加了引用,瞧,错误和警告。

问题:我的 HTTP 地址包含一些 WCF 不喜欢的关键字。特别是 COM 这个词(它也与 LPT 断开)。

所以我的解决方案:修改我的 HTTP 地址不包含 COM 字样。它对我有用。

【讨论】:

【参考方案3】:

如果服务是通过 HTTPS 托管的,请进入服务器的 IIS 管理器。在站点的“SSL 设置”下,确保选中“要求 SSL”,并选中“接受”的客户端证书单选按钮。

【讨论】:

以上是关于WCF AddServiceReference 导致自定义工具错误,不产生代理的主要内容,如果未能解决你的问题,请参考以下文章

服务参考与 Web 参考

从 wcf 服务调用第三方 Web 服务

WCF: Generate Proxy Class and Configuration file for Client

使用WS-MetadataExchange为外部客户端和WcfTestClient公开来自Service Fabric的WCF / TCP端点

.NET 中的通道工厂是啥?

如何在 .NET Standard 项目中“添加服务引用”