Мы используем пользовательский класс, который использует XmlSchemaProviderAttribute, чтобы он выглядел как строка.Он объявлен следующим образом:
[XmlSchemaProvider("GetSchema")]
public sealed class CDataWrapper : IXmlSerializable
{
public static XmlQualifiedName GetSchema(XmlSchemaSet xs)
{
return XmlSchemaType.GetBuiltInSimpleType(XmlTypeCode.String).QualifiedName;
}
// implicit to/from string
public static implicit operator string(CDataWrapper value)
{
return value == null ? null : value.Value;
}
public static implicit operator CDataWrapper(string value)
{
return value == null
? null
: new CDataWrapper
{
Value =
value
};
}
public System.Xml.Schema.XmlSchema GetSchema()
{
return null;
}
// "" => <Node/>
// "Foo" => <Node><![CDATA[Foo]]></Node>
public void WriteXml(XmlWriter writer)
{
if (!string.IsNullOrEmpty(Value))
{
writer.WriteCData(Value);
}
}
// <Node/> => ""
// <Node></Node> => ""
// <Node>Foo</Node> => "Foo"
// <Node><![CDATA[Foo]]></Node> => "Foo"
public void ReadXml(XmlReader reader)
{
if (reader.IsEmptyElement)
{
Value = "";
}
else
{
reader.Read();
switch (reader.NodeType)
{
case XmlNodeType.EndElement:
Value = ""; // empty after all...
break;
case XmlNodeType.Text:
case XmlNodeType.CDATA:
Value = reader.ReadContentAsString();
break;
default:
throw new InvalidOperationException("Expected text or CData but was: "+ reader.NodeType);
}
}
}
// underlying value
public string Value { get; set; }
public override string ToString()
{
return Value;
}
}
Класс CDataWrapper взят из этого вопроса .Мы используем его, поскольку один из наших клиентов (клиент FLEX) не может правильно прочитать начальные \ конечные пробелы.И мы делаем так, чтобы это выглядело как строка в схеме, чтобы не нарушать договор с другими нашими клиентами.Обычно это работает хорошо, но один из наших клиентов не может сгенерировать прокси со схемой, которую WCF создает для службы, которая использует вышеупомянутый класс-оболочку.Мы проследили причину этой строки в нашем wsdl:
<xsd:import schemaLocation="http://my.services.com/service/mex?xsd=xsd4" />
И его содержимое:
<?xml version="1.0" encoding="utf-8" ?>
- <xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="string" nillable="true" type="xs:string" />
</xs:schema>
Проблема заключается в том, что в xsd: import нет атрибута пространства именэлемент выше, и прокси-генератор нашего клиента не может справиться с этим хорошо.
Короче, как мы можем добавить атрибут namespace к сгенерированному wsdl?