Соответствие типов аргумента и результата в .NET Web Method (SOAP) - PullRequest
1 голос
/ 28 декабря 2011

Я портирую существующую веб-службу SOAP на веб-службу C #. Это разработка в коричневом поле, поэтому я должен придерживаться существующей схемы / WSDL. Я пишу веб-службу вручную (ничего не генерируя).

Моя проблема, похоже, связана с тем, что мой веб-метод имеет такой же тип XSD для своего параметра и типа возврата . Я использовал XSD.exe для генерации связанных классов для всех схем.

Вот мой веб-метод:

[WebMethod]
[SoapHeader("soapHeader")]
[SoapDocumentMethod(Action = "ActionURI", Binding = "myBinding", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Bare)]
[return: XmlElement("UQL", Namespace = "UQLNamespace")]
public UQL UQL([XmlAnyElement("UQL", Namespace = "UQLNamespace")] XmlElement wspRequest)
{ .. }

Этот метод ожидает входящее сообщение примерно так:

<soap:envelope>
  <soap:header>...</soap:header>
  <soap:body>
    <UQLNamespace:UQL>
      <childOne>...</childOne>
      <childTwo>...</childTwo>
      <childThree>
        <childThreeA>...</childThreeA>
      </childThree>
    </UQLNamespace:UQL>
  </soap:body>
</soap:envelope>

Должно возвращаться сообщение вроде:

<soap:envelope>
  <soap:body>
    <UQLNamespace:UQL>
      ...
    </UQLNamespace:UQL>
  </soap:body>
</soap:envelope>

Сгенерированный класс XSD.exe выглядит следующим образом:

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="UQLNamespace")]
[System.Xml.Serialization.XmlRootAttribute(Namespace="UQLNamespace", IsNullable=false)]
public partial class UQL { .. }

Теперь проблема в том, что я получаю ошибку отражения, когда я вызываю веб-службу с соответствующим форматом сообщения (как показано выше).

Метод YourWebService.UQL не может быть отражен. Там была ошибка отражая «UQLResult». Верхний элемент XML 'UQL' из пространства имен UQLNamespace ссылается на различные типы System.Xml.XmlElement и UQL. Используйте атрибуты XML, чтобы указать другое имя XML или пространство имен для элемент или типы.

Теперь, если я удалю аннотацию [return: ...] из веб-метода, он вернется успешно, но вернет XML с именем элемента UQLResult вместо UQL. Что, конечно, не то, что мне нужно.

Есть ли у вас идеи, как я могу разрешить конфликт в исключении выше?

...