verwendetes Datenbanksystem: XML/XSD
Hallo zusammen,
ich habe eine SoapExtension geschrieben, welche die SOAP Nachricht gegen eine XSD prüft und validiert:
public override void ProcessMessage(SoapMessage message)
{
switch (message.Stage)
{
case SoapMessageStage.BeforeDeserialize:
if (!ValidateAgainstSchema(message.Stream))
{
throw new SoapException("Message could not be validated against Schema", new XmlQualifiedName("ValidationError"));
}
message.Stream.Position = 0;
break;
}
}
private bool ValidateAgainstSchema(Stream s)
{
bool validationResult = true;
var settings = new XmlReaderSettings { ValidationType = ValidationType.Schema };
settings.ValidationEventHandler += (o, e) => { validationResult = false; };
try
{
settings.Schemas.Add(null, AppDomain.CurrentDomain.BaseDirectory + _xsdFile);
using (XmlReader validatingReader = XmlReader.Create(s, settings))
{
while (validatingReader.Read())
{
//Do nothing just read
}
}
}
catch (Exception)
{
validationResult = false;
}
return validationResult;
}
Dazu sende ich einfach folgende NAchricht :
<soapenv:Header>
<upl:AuthenticationHeader>
<upl:Username></upl:Username>
</upl:AuthenticationHeader>
</soapenv:Header>
<soapenv:Body>
<upl:LoginUser>
<upl:version>1.0.0</upl:version>
</upl:LoginUser>
<SCHADCODE>DAS SOLLTE KRACHEN GEHEN</SCHADCODE>
</soapenv:Body>
Ind er XSD sind alle Elemente definiert, ausser das Tag SCHADCODE
Leider sagt die Validierung dass alles ok ist, obwohl der Tag SCHADCODE gar nicht vorkommen darf ....
mache ich was falsch ?
Hallo,
hast du denn schon den Debugger benutzt, d.h. wird der ValidationEventHandler angesprungen?
Bei meinem Testprojekt hatte ich noch
xmlReaderSettings.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings;
gesetzt gehabt.
Hallo,
er springt nicht in den Eventhandler rein.
Sobald ich das Warning Flag setze, fliegt er mir schon bei soap:Envelope raus, da er sagt dafür gibt es kein Schema (logisch ist ja ein SoapHeader).
Beim Tag SCHADCOE setzt er aber auch aus.
Ist jetzt die Frage ob ich Händisch noch ein SOAP Schema mit hinzufüge was valide ist also body und header mit aufnehme
Grüße
Hallo,
ok, das Flag war es tatsächlich.
Wenn ich noch die Soap xsds mit in den SchemaCache lade, stolpert er tatsächlich nur über das
SCHADCODE Tag so wie es sein sollte 😃
Grüße