我在ASP.NET 4.6.2中遇到极慢的XML反序列化问题。 需要使用XmlSchemaSet反序列化包含XML的字符串,该字符串在我们自己的开发环境中可以正常工作,但是由于某些原因,我们的客户在IIS上使用相同的XML和相同的XML运行相同的代码(Windows Server 2012 r2,因此我认为IIS 8.5)具有极大的延迟:检索模式集需要20秒,而反序列化XML需要40秒,即使相同的代码可以立即对其他XML / Schema进行反序列化。 因为代码在远程安全环境中运行,所以我很难调试问题,而且似乎无法在本地重现问题。
此代码在IIS中的本地测试,单元测试和运行中进行了广泛的测试,即使在使用相同的Xml架构集和相同的数据的情况下,它也可以完美地工作。 我们的日志记录系统看不到任何异常或错误。我想使用ProcMon扫描任何事件,但是我目前无法访问托管环境:-( 该模式集由6个XSD文件组成,这些文件具有大约100个类型/模板,因此不要过多。 xml文件长约72行。
public static object DeSerializeClassFromString(string xml, Type targetType, XmlSchemaSet schema)
{
XmlReaderSettings settings = null;
if (schema != null)
{
settings = new XmlReaderSettings();
settings.ValidationType = ValidationType.Schema;
settings.ValidationFlags =
XmlSchemaValidationFlags.ProcessIdentityConstraints |
XmlSchemaValidationFlags.ReportValidationWarnings | XmlSchemaValidationFlags.ProcessInlineSchema;
settings.ValidationEventHandler += new ValidationEventHandler(DeSerializeClassFromString_ValidationEventHandler);
settings.Schemas.Add(schema);
}
// Use an xmlTextReader to get the proper encoding for the xml
XmlReader reader = XmlTextReader.Create(new XmlTextReader(new StringReader(xml)), settings);
object res = DeSerializeClass(reader, targetType);
return res;
}
public void TestFunction(string xml)
{
var xss = new System.Xml.Schema.XmlSchemaSet();
xss.Add(@"http://www.hostname.nl/schema/Messages/2010/02/Header",
XmlReader.Create(new MemoryStream(Properties.Resources.resource1)));
xss.Add(@"http://www.hostname.nl/schema/Messages/2010/02/Types",
XmlReader.Create(new MemoryStream(Properties.Resources.resource2)));
var obj = DeSerializeClassFromString(xml, typeof(myType), xss);
}
我希望代码在几毫秒内运行,而不是40秒。