Search code examples
azurexsdxml-validationblazor-webassemblyazure-static-web-app

Why is XML validation in a Blazor application giving different messages on localhost and as an Azure Static Web App?


edit I made a simplified repo at https://github.com/GilShalit/XMLValidation


I am building an XML editor in Blazor WebAssembly (TargetFramework=net5.0). Part of the functionality involves validating the XML for completeness and according to a complex xsd schema with three includes.

These are the steps I follow:

  1. build an XmlSchemaSet and add 4 schemas to it by calling the following method for each xsd:
    private async Task loadSchema(string path, string nameSpace)
    {
        byte[] byteArrayS = await _client.GetByteArrayAsync(path);
        Console.WriteLine($"{path}: {byteArrayS.Length}");
        MemoryStream streamS = new MemoryStream(byteArrayS);
        XmlReader xmlSchemaReader = XmlReader.Create(streamS);
        schemaSet.Add(nameSpace, xmlSchemaReader);
    }
  1. Initializing an event handler with:
ValidationEventHandler eventHandler = new ValidationEventHandler(ValidationEventHandler);
  1. loading the XML into an XmlDocument:
        byte[] byteArrayX = Encoding.ASCII.GetBytes(await _editorTarget.GetValue());
        MemoryStream streamX = new MemoryStream(byteArrayX);
        XmlReader reader = XmlReader.Create(streamX);
        XmlDocument document = new XmlDocument();
        document.Load(reader);
  1. validating according to the schemaSet:
            document.Schemas = schemaSet;
            document.Validate(eventHandler);

ssteps 3 and 4 are run inside a Try...Catch block and running locally when the XML is not well formed (missing closing tag for example), the document.Load(reader); line produces an error with a message like the following:

The 'publicationStmt1' start tag on line 9 position 11 does not match the end tag of 'publicationStmt'. Line 11, position 12.

which is great. But validating a similar situation in the application deployed to Azure produces the following error message:Xml_MessageWithErrorPosition, Xml_TagMismatchEx, 11, 12.

Schema validation errors are caught in the event handler when the line document.Validate(eventHandler); is run and a typical message is:

The element 'fileDesc' in namespace 'http://www.tei-c.org/ns/1.0' has invalid child element 'publicationStmt1' in namespace 'http://www.tei-c.org/ns/1.0'. List of possible elements expected: 'editionStmt, extent, publicationStmt' in namespace 'http://www.tei-c.org/ns/1.0'.

But when run on Azure the message is Sch_InvalidElementContentExpecting.

What could the reason for this difference in the validation results between running locally and in Azure?

I tried to disable linking by adding:

<ItemGroup>
  <BlazorLinkerDescriptor Include="LinkerConfig.xml" />
</ItemGroup>

But that did not make a difference in the deployed application, and running locally with Release instead of Debug did not change anything either.

I also made sure the 4 xsd files are actually loaded when running from Azure.


Solution

  • So this was a feature not a bug...

    An issue I opened on Dev community was picked up by the dotnet/runtime team and added to the GitHub issue tracker here.

    It turns out exception messages are removed to save on size.

    Using <UseSystemResourceKeys>false</UseSystemResourceKeys> enables exception messages and I must say I am not seeing an increase in size.