XmlSchemaProviderAttribute и xsd: import - PullRequest
1 голос
/ 26 декабря 2010

Мы используем пользовательский класс, который использует 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?

1 Ответ

1 голос
/ 07 января 2011

Эта информация (обычно) избыточна и, поскольку целевое пространство имен импортируемого xsd также определено в этом XSD:

<xs:schema elementFormDefault="qualified" targetNamespace="http://www.w3.org/2001/XMLSchema">

Если невозможно изменить прокси-генератор, это будет вариант предварительной обработкиосновной wsdl и вставить targetnamspace также в основной wsdl?

Если это не вариант, вам может помочь статья .

Если это все еще не решение, вы можете попытаться полностью сгладить wsdl и удалить xsd: importс этим WSDLFlattener

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...