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

Ran*_*ani 5 .net c# wcf serialization visual-studio-2010

"添加服务引用"的问题,实际上是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
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

警告1自定义工具警告:无法导入wsdl:portType详细信息:运行WSDL导入扩展时抛出异常:System.ServiceModel.Description.DataContractSerializerMessageContractImporter错误:引用类型'ServiceLibrary.MyStructure,ServiceLibrary,Version = 1.0.0.0,Culture =由于与导入的DataContract不匹配,因此无法使用名称空间''中的数据协定名称'MyStructure'的中性,PublicKeyToken = null'.需要从引用的类型中排除此类型.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属性时,互联网已经完整地描述了这一点.

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

dbl*_*ood 0

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

请参阅此问题中的其他信息