Проблема с «Добавить ссылку на службу», а на самом деле с 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
Ошибка: ссылочный тип «ServiceLibrary.MyStructure, ServiceLibrary, версия = 1.0.0.0, Culture = нейтральный, PublicKeyToken = null» с именем контракта данных «MyStructure» в пространстве имен »не может использоваться, поскольку он не соответствует импортированному DataContract. Необходимо исключить этот тип из ссылочных типов.
XPath to Error Источник: // wsdl: определения [@targetNamespace = 'http://tempuri.org/']/wsdl:portType[@name='IService1'] \ Projects \ WCFSample \ WCFExample \ TestAddReference \ Ссылки на службу \ ServiceReference1 \ Reference.svcmap 1 1 TestAddReference
======================
И для вас не будет сгенерирован прокси.
Теперь в Интернете полно описаний этого, когда у вас есть универсальный DataContract и / или используется атрибут IsReference.
Это очень серьезная проблема, так как любые нетипизированные данные решат эту проблему.
Не смог найти способ решить проблему. Что если я хочу узнать тип на стороне клиента, поделившись библиотекой классов контрактов?