"Referência do grupo de atributos circulares".
-
25-09-2019 - |
Pergunta
É a situação estranha mais uma vez :)
Eu funcionei que verifica o XML em relação ao XSD e lança exceção quando a validação falha. (A função é chamada da página da web que recebe as chamadas XML)
Ambos a chamada
if (!xmlvld.ValidXmlDoc(X, "", "https://somepathtofile.xsd"))
throw new Exception(xmlvld.ValidationError + "1");
e a função de validação é bem simples
/// <summary>
/// This method validates an xml string against an xml schema.
/// </summary>
/// <param name="xml">StringReader containing xml</param>
/// <param name="schemaNamespace">XML Schema Namespace</param>
/// <param name="schemaUri">XML Schema Uri</param>
/// <returns>bool</returns>
public bool ValidXmlDoc(StringReader xml, string schemaNamespace, string schemaUri)
{
// Continue?
if (xml == null || schemaNamespace == null || schemaUri == null)
{
return false;
}
isValidXml = true;
XmlValidatingReader vr;
XmlTextReader tr;
XmlSchemaCollection schemaCol = new XmlSchemaCollection();
schemaCol.Add(schemaNamespace, schemaUri);
try
{
// Read the xml.
tr = new XmlTextReader(xml);
// Create the validator.
vr = new XmlValidatingReader(tr);
// Set the validation tyep.
vr.ValidationType = ValidationType.Auto;
// Add the schema.
if (schemaCol != null)
{
vr.Schemas.Add(schemaCol);
}
// Set the validation event handler.
vr.ValidationEventHandler += new ValidationEventHandler(ValidationCallBack);
// Read the xml schema.
while (vr.Read())
{
}
vr.Close();
return isValidXml;
}
catch (Exception ex)
{
this.ValidationError = ex.Message;
return false;
}
finally
{
// Clean up...
vr = null;
tr = null;
}
}
E isso funcionou muito bem nos últimos 2 anos, mas recentemente a função de validação começou a devolver a mensagem seguinte:
[ValidationError]Circular attribute group reference.[/ValidationError]
Que é uma mensagem falsa - nem o XSD nem o XML enviado mudaram, além disso, se eu reciclar o pool de aplicativos e enviar o mesmo XML novamente (o programa "ping" que envia o mesmo XML a cada poucos segundos e verifica o resultado) A validação passa ... por um tempo (alguns estão entre alguns minutos e poucas horas).
O XSD está no mesmo diretório da página de chamada e, no log do servidor, vejo a solicitação ao XSD com resposta HTTP/200, até tentei alterar os HTTPs para o caminho local, mas o erro permaneceu o mesmo (apontando para o endereço inválido fornece exceções HTTP/404 ou caminho inválido para que ele tenta ler o arquivo XSD)
Novamente - a reciclagem do AppPool resolve -o imediatamente, mas não consigo reciclar a cada 5 minutos.
Desde já, obrigado! Simon
Solução
Você não vai gostar desta resposta, mas aparentemente o XmlValidatingReader
estava obsoleto no .NET 2.0 ... talvez por causa de questões como essa?
A sugestão é Validar usando um XmlReader
. Esse link é para a versão 2.0 dos arquivos de ajuda, que incluem alguns detalhes específicos para converter de um XmlValidatingReader
; Versões mais recentes da ajuda estão disponíveis no suspensão no topo.
Esse link dá detalhes sobre o XmlValidatingReader
sendo obsoleto.
Um exemplo de usar um XmlReader
é aqui.