Отображение перечисления WSDL в строку в веб-службе ASP.NET - PullRequest
0 голосов
/ 28 апреля 2009

Справочная информация: Я нахожусь в процессе создания веб-службы с использованием 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>

Webservice:

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 не удается правильно сопоставить поля.

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

С уважением,

Мэтт

1 Ответ

1 голос
/ 01 мая 2009

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

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

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

...