Ho il seguente codice di analisi XML nella mia domanda:pause XmlReader in UTF-8 BOM
public static XElement Parse(string xml, string xsdFilename)
{
var readerSettings = new XmlReaderSettings
{
ValidationType = ValidationType.Schema,
Schemas = new XmlSchemaSet()
};
readerSettings.Schemas.Add(null, xsdFilename);
readerSettings.ValidationFlags |= XmlSchemaValidationFlags.ProcessInlineSchema;
readerSettings.ValidationFlags |= XmlSchemaValidationFlags.ProcessSchemaLocation;
readerSettings.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings;
readerSettings.ValidationEventHandler +=
(o, e) => { throw new Exception("The provided XML does not validate against the request's schema."); };
var readerContext = new XmlParserContext(null, null, null, XmlSpace.Default, Encoding.UTF8);
return XElement.Load(XmlReader.Create(new StringReader(xml), readerSettings, readerContext));
}
Io lo utilizzo per analizzare le stringhe inviate al mio servizio WCF in documenti XML, per la deserializzazione personalizzato.
Funziona bene quando leggo i file e li mando sul filo (la richiesta); Ho verificato che il BOM non è stato inviato. Nel gestore della richiesta sto serializzando un oggetto risposta e inviandolo indietro come stringa. Il processo di serializzazione aggiunge un BOM UTF-8 alla parte anteriore della stringa, causando la rottura dello stesso codice durante l'analisi della risposta.
Nella ricerca che ho fatto nell'ultima ora circa, sembra che XmlReader debba onorare il BOM. Se rimuovo manualmente il BOM dalla parte anteriore della stringa, la risposta xml è corretta.
Mi manca qualcosa di ovvio, o almeno qualcosa di insidioso?
EDIT: Ecco il codice di serializzazione che sto usando per restituire la risposta:
private static string SerializeResponse(Response response)
{
var output = new MemoryStream();
var writer = XmlWriter.Create(output);
new XmlSerializer(typeof(Response)).Serialize(writer, response);
var bytes = output.ToArray();
var responseXml = Encoding.UTF8.GetString(bytes);
return responseXml;
}
Se è solo una questione di XML che contiene in modo errato il BOM, allora io passare a
var responseXml = new UTF8Encoding(false).GetString(bytes);
ma dalla mia ricerca non risultava chiaramente che il DB era illegale nella stringa XML effettiva; vedere per es. c# Detect xml encoding from Byte Array?
Ho avuto questo problema qui: http://stackoverflow.com/questions/291455/xml-data-at-root-level-is-invalid –