Я создал веб-сервис на 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...
}
Два вопроса:
- Есть ли способ, которым я могу проверить исходный XML-код, отправленный клиентом, по моему исходному XSD?
- Что-то не так с тем, как я создал этот сервис?
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>