Дизайн веб-сервисов и как я могу получить необработанный XML, отправленный вызову веб-сервиса в C # .net, чтобы я мог проверить его на соответствие XSD? - PullRequest
0 голосов
/ 20 августа 2009

Я создал веб-сервис на C # .net 2.0. Мне нужно захватить необработанный XML, отправленный клиентом, проверить его на соответствие XSD и вернуть клиенту любые ошибки. Веб-сервис позволит клиенту загрузить список виджетов в нашу систему.

Ниже приведена справочная информация:

Я создал XSD для моделирования «виджета», представляющего собой сложный объект. Это выглядит примерно так:

<xs:element name="WidgetList">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="Widget" maxOccurs="unbounded" type="WidgetType" />
        </xs:sequence>
    </xs:complexType>
</xs:element>
<xs:complexType name="WidgetType">
    <xs:sequence maxOccurs="1" minOccurs="1">
        <xs:element name="Seller" type="AccountType" maxOccurs="1" minOccurs="1" />
        <xs:element name="Buyer" type="AccountType" maxOccurs="1" minOccurs="1" />
    </xs:sequence>
    <xs:attribute name="Market" type="MarketType" use="required" />
</xs:complexType>
<!-- etc... -->

Затем я использовал XSD.exe для генерации классов из xsd.
Создаваемые классы: WidgetList, Widget, Продавец, Покупатель и т. Д.

Затем я создал метод веб-сервиса для загрузки. Это выглядит так:

[WebMethod]
[SoapHeader("SecurityAuthenticationHeader", Direction = SoapHeaderDirection.In)]
public string UploadWidgets(WidgetList wl)
{
    //Need to validate the XML against the XSD here.

    //Code to import...
}

Два вопроса:

  1. Есть ли способ, которым я могу проверить исходный XML-код, отправленный клиентом, по моему исходному XSD?
  2. Что-то не так с тем, как я создал этот сервис?

UPDATE:
Причина, по которой мне нужно это сделать, заключается в том, что, хотя XSD говорит, что поля обязательны для заполнения или minOccurs = 1 , кажется, что эти свойства не требуются в WSDL (не совсем понятно, почему).

Вот как выглядит часть WSDL (для краткости удалены ненужные части):

<s:schema elementFormDefault="qualified" targetNamespace="http://www.clearpar.com/XMLSchema">
  <s:element name="lt">
    <s:complexType>
      <s:sequence>
        <s:element minOccurs="0" maxOccurs="unbounded" name="LoanTrade" type="s1:LoanTradeType" /> 
      </s:sequence>
     </s:complexType>
   </s:element>
<s:complexType name="LoanTradeType">
  <s:sequence>
    <s:element minOccurs="0" maxOccurs="1" name="Seller" type="s1:AccountType" /> 
    <s:element minOccurs="0" maxOccurs="1" name="Buyer" type="s1:AccountType" /> 
  </s:sequence>
  <s:attribute name="Market" type="s1:MarketType" use="required" /> 
</s:complexType>
<s:complexType name="AccountType">
  <s:attribute name="Name" type="s:string" /> 
  <s:attribute name="ClientSystemID" type="s:string" /> 
</s:complexType>

Ответы [ 3 ]

1 голос
/ 21 августа 2009

Не думаю, что есть простой способ сделать это.

Есть статья MSDN о реализации SoapExtension для выполнения проверки схемы. Это маршрут, который я выбрал, с некоторыми улучшениями.

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

0 голосов
/ 21 августа 2009

Для вопроса 1: единственный известный мне способ проверки входящего сообщения - создать SOAP-расширение, которое проверяет входящее сообщение по ожидаемой схеме. Причина в том, что сантехника .NET десериализует входящий XML в объект перед входом в ваш WebMethod. Если есть проблема с входящим XML, то ваш веб-метод никогда не будет введен, и сбой SOAP будет возвращен клиенту. Другая проблема заключается в том, что, возможно, десериализатор не десериализуется «должным образом». Прочитайте статью Проверка схемы XML для получения дополнительной информации.

В отношении вопроса 2: ваш подход верен для контрактной первой разработки с использованием (asmx) веб-сервисов. Мой вопрос к вам: почему бы не использовать WCF для предоставления веб-службы вместо старой технологии ASMX? WCF также поддерживает проверку схемы .

0 голосов
/ 21 августа 2009

Поскольку вам требуется более строгий контроль над WSDL, я рекомендую написать его вручную и сгенерировать как интерфейс / данные / сообщения контракта на обслуживание, так и клиентские прокси из одного контракта WSDL. На CodePlex есть замечательный проект WCSF.blue , который может помочь вам в разработке контракта в первую очередь.

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