Ich habe einen C# .net 2.0 Webservice erstellt. Ich muss das rohe XML erfassen, das vom Client gesendet wurde, und es für eine XSD validieren und Fehler an den Client zurückgeben. Der Webservice ermöglicht dem Kunden, eine Liste von Widgets auf unser System hochzuladen.Webservices Design und Wie kann ich das Roh-XML erfassen, das an einen Webservice-Aufruf in C# .net gesendet wird, damit ich es gegen eine XSD validieren kann?
Nachfolgend einige Hintergrundinfos:
ich eine XSD erstellt einen „Widget“ zu modellieren, die ein komplexes Objekt ist. Es sieht ungefähr so aus:
<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... -->
Dann benutzte ich XSD.exe Klassen aus dem XSD zu erzeugen.
Die Klassen, die erstellt werden, sind WidgetList, Widget, Verkäufer, Käufer, usw.
Als nächstes habe ich eine Webservice-Methode das Hochladen zu nehmen. Es sieht so aus:
[WebMethod]
[SoapHeader("SecurityAuthenticationHeader", Direction = SoapHeaderDirection.In)]
public string UploadWidgets(WidgetList wl)
{
//Need to validate the XML against the XSD here.
//Code to import...
}
Zwei Fragen:
- Gibt es eine Möglichkeit, dass ich die XML-Rohdaten vom Client an meiner ursprünglichen XSD gesendet validieren kann?
- Ist etwas falsch mit der Art, wie ich diesen Service erstellt habe?
UPDATE:
Der Grund, warum ich dies tun müssen, ist, dass, obwohl die XSD sagt Felder erforderlich oder minOccurs = 1, so scheint es, dass diese Eigenschaften nicht in der WSDL erforderlich (Nicht wirklich sicher warum).
Dies ist, was Teil der WSDL sieht aus wie (entfernt unnötige Teile der Kürze halber):
<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>
Ich habe nicht gehört, dass es in WCF geändert wurde. Auch, BTW, ist es nicht korrekt zu sagen, dass der Dienst das Schema kennt. Bei ASMX-Diensten wird das Schema normalerweise aus den Service-Metadaten generiert, nicht umgekehrt. Der XML-Serializer erstellt dann basierend auf den gefundenen .NET-Typen den benötigten Code, indem er die Servicemetadaten reflektiert. Bislang ist keine XML-Manipulation beteiligt. Zur Laufzeit wird das Schema nicht einmal durch den generierten Serialisierungscode impliziert, der die meisten Facetten des Schemas ignoriert. –