使用XmlSchemaSet在IIS上进行XML反序列化的速度非常慢(ASP.NET 4.6.2)

时间:2019-06-14 07:55:58

标签: c# iis serialization xsd xml-deserialization

我在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秒。

0 个答案:

没有答案