none
Проблема генерации c# прокси на основе Wsdl, в котором используется simpleType с union. RRS feed

  • Общие обсуждения

  • Столкнулся с проблемой генерации c# кода на основе wsdl генерируемого сервисами java, которые публикуют свои метаданные используя wsdl.

    Проблема заключается в том, что при использовании стандартных утилит: Wsdl.exe, SvcUtil.exe, Xsd.exe, WseWsdl3.exe, если wsdl или xsd документы содержат описание типа в теге simpleType, в котором используется тег union то на выходе
    - тип simpleType\union заменяется на тип string
    - все типы, на которые ссылается конструкция union в атрибуте memberTypes, игнорируются и c# определения для них не создаются.

    Поясню на примере:

    1) Получаю конструкцию типа:

    <xs:element name="SomePoperty" type="stp:SomePopertyOpenEnum" />
    <xs:simpleType name="SomePopertyOpenEnum">
      <xs:union memberTypes="stp:SomePopertyEnum xs:anyURI" />
    <!-- Возможен еще вариант:
      <xs:union memberTypes="stp:SomePopertyEnum" />
    -->
    </xs:simpleType>
    <xs:simpleType name="SomePopertyEnum">
      <xs:restriction base="xs:anyURI">
        <xs:enumeration value="some.url1" />
        <xs:enumeration value="some.url2" />
        ...
        <xs:enumeration value="some.urlm" />
      </xs:restriction>
    </xs:simpleType>

    ------------------------------------------------------------------


    это преобразуется в код:

    private string somePopertyField;
    ...
    [System.Xml.Serialization.XmlElementAttribute(DataType="anyURI")]
    public string SomePoperty {
        get {
            return this.somePopertyField;
        }
        set {
            this.somePopertyField = value;
        }
    }

    ------------------------------------------------------------------


    тогда как ожидалось нечто вроде :

    private SomePopertyEnum somePopertyField;

    ...

    [System.Xml.Serialization.XmlElementAttribute(DataType="anyURI")]
    public SomePopertyEnum SomePoperty {
        get {
            return this.somePopertyField;
        }
        set {
            this.somePopertyField = value;
        }
    }

    ...

    [XmlType(Namespace = "some.default.namespac.url")]
    [Serializable]
    public enum SomePopertyEnum
    {
      [XmlEnum("some.url1")]
      httpsomeurl1,

      [XmlEnum("some.url2")]
      httpsomeurl2,

      ...
      [XmlEnum("some.urlm")]
      httpsomeurlm,
    }

    ------------------------------------------------------------------


    или пусть даже будет вариант со string, но нужно, чтобы сохранялись значения, которые определяют область допустимых значений для формирования Response:

    public static class SomePopertyEnum
    {
      public const string httpsomeurl1 = "some.url1";

      public const string httpsomeurl2 = "some.url2";
      ...
      public const string httpsomeurlm = "some.urlm";
    }

    Идея пока одна - эквивалентными преобразованиями отредактировать полученные файлы wsdl и xsd :


    Думаю для варианта 1

    <xs:union memberTypes="stp:SomePopertyEnum" />

    отредактировать WSDL - просто заменить тип SomePopertyOpenEnum на SomePopertyEnum.

    Вариант 2:
    <xs:union memberTypes="stp:SomePopertyEnum xs:anyURI" />

    несколько непонятно как переделать под просто перечисление.

    В энумераторе перечислены те значения, что пока известны и есть указание на пока неизвестные, но тем неменее валидные значения - xs:anyURI - типа задел на будущее.

    Может ли кто посоветовать утилиты, которые могут генерировать прокси без потери дополнительной информации? Или каким образом можно руками отредактировать wsdl чтобы не оставалось проблем с сериализацией и десериализацией?

    Заранее спасибо.

    18 декабря 2015 г. 17:11