Сопоставление перечисления WSDL со строкой в ​​веб-службе ASP.NET

Предыстория: я создаю веб-службу с помощью ASP.NET 2.0. Эта веб-служба предоставляет другой интерфейс для существующей веб-формы, которая содержит поля выбора, динамически заполняемые из базы данных.

Мой первый проект веб-сервиса принимал строку для каждого из них, а затем проверял ее правильность, возвращая ошибку, если это не так. Однако потребитель веб-службы попросил, поскольку возможные значения вряд ли будут меняться так часто, чтобы мы предоставили перечисляемые значения в WSDL.

Я не хочу создавать перечисление с кодом моего веб-сервиса, поэтому вместо этого я изменил сгенерированный файл WSDL и дал указание своему веб-сервису использовать его вместо проверки моих классов для его создания.

WSDL:

<?xml version="1.0" encoding="utf-8"?>
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="http://example.org/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" targetNamespace="http://example.org/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
  <wsdl:types>
    <s:schema elementFormDefault="qualified" targetNamespace="http://example.org/">
      <s:element name="MyMethod">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name="myClass" type="tns:MyClass" />
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:complexType name="MyClass">
        <s:sequence>
          <s:element minOccurs="0" maxOccurs="1" name="MyString" type="tns:MyStringPossibleValues" />
        </s:sequence>
      </s:complexType>
      <s:element name="MyMethodResponse">
        <s:complexType />
      </s:element>
      <s:simpleType name="MyStringPossibleValues">
        <s:restriction base="s:string">
          <s:enumeration value="alpha" />
          <s:enumeration value="bravo" />
        </s:restriction>
      </s:simpleType>
    </s:schema>
  </wsdl:types>
  <wsdl:message name="MyMethodSoapIn">
    <wsdl:part name="parameters" element="tns:MyMethod" />
  </wsdl:message>
  <wsdl:message name="MyMethodSoapOut">
    <wsdl:part name="parameters" element="tns:MyMethodResponse" />
  </wsdl:message>
  <wsdl:portType name="ExternalAccessSoap">
    <wsdl:operation name="MyMethod">
      <wsdl:input message="tns:MyMethodSoapIn" />
      <wsdl:output message="tns:MyMethodSoapOut" />
    </wsdl:operation>
  </wsdl:portType>
  <wsdl:portType name="ExternalAccessHttpGet" />
  <wsdl:portType name="ExternalAccessHttpPost" />
  <wsdl:binding name="ExternalAccessSoap" type="tns:ExternalAccessSoap">
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" />
    <wsdl:operation name="MyMethod">
      <soap:operation soapAction="http://example.org/MyMethod" style="document" />
      <wsdl:input>
        <soap:body use="literal" />
      </wsdl:input>
      <wsdl:output>
        <soap:body use="literal" />
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>
  <wsdl:binding name="ExternalAccessSoap12" type="tns:ExternalAccessSoap">
    <soap12:binding transport="http://schemas.xmlsoap.org/soap/http" />
    <wsdl:operation name="MyMethod">
      <soap12:operation soapAction="http://example.org/MyMethod" style="document" />
      <wsdl:input>
        <soap12:body use="literal" />
      </wsdl:input>
      <wsdl:output>
        <soap12:body use="literal" />
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>
</wsdl:definitions>

Веб-служба:

namespace Example.Service
{
    [WebService(Namespace = "http://example.org/")]
    [WebServiceBinding(
        ConformsTo = WsiProfiles.BasicProfile1_1,
        Location="ExternalAccess.wsdl",
        Name="ExternalAccessSoap",
        Namespace = "http://example.org/")]
    [ToolboxItem(false)]
    public class ExternalAccess : System.Web.Services.WebService
    {
        public class MyClass
        {
            public string MyString;
        }

        [WebMethod]
        [SoapDocumentMethod(
            Action = "http://example.org/MyMethod",
            RequestNamespace = "http://example.org/",
            Binding="ExternalAccessSoap")]
        public void MyMethod(MyClass myClass)
        {
        }
    }
}

Проблема: поскольку WSDL указывает перечисление для MyString, а код указывает строковый тип, ASP.NET не удается правильно сопоставить поля.

Есть ли атрибут, который я могу использовать, чтобы указать десериализатору заполнить строковое поле значением перечисления?

С уважением,

Мэтт


person Matt    schedule 28.04.2009    source источник


Ответы (1)


Пройдя через процесс создания расширения мыла, чтобы сделать это для меня, я обнаружил, что MyString на самом деле не отправлялся в мой веб-сервис.

Это произошло потому, что тестовое приложение для этой службы также было создано в .NET, и при построении объекта запроса свойство MyStringSpecified сгенерированного прокси-класса было упущено. Это предотвратило отправку перечисляемого значения как часть запроса SOAP.

Когда для этого свойства было задано значение true, перечисляемое значение было успешно присвоено полю MyString в веб-службе.

person Matt    schedule 01.05.2009