大动态的XML Web API的性能问题(Web API performance issues wi

2019-10-22 05:24发布

我创建了一个SQL的WebAPI界面,使用户的发展动态可以通过RESTful接口查询数据库。 它速度快于小型查询,但在较大的发挥作用有尤其是当多个同时通话是由严重滞后的问题。 我已经在这个运行性能分析和绝大多数处理的是上线完成:

var xe = reader.ReadOuterXml();

该客户期待XML文本字符串,所以我试着只是做一个ExecuteReader但随后的结果在2033字节块回到这似乎是慢这是不幸的,因为运行在SQL Server Management Studio中(与此查询“FOR XML AUTO “)几乎是瞬间。

我与16MB的XML响应测试,但他们的反应是150MB的向上 - 200MB。

如何优化这个处理这些大的反应比较好? 代码如下:

public XElement AdHockSelect([FromBody] XElement valueElement, string connectionStringName, string database)
{
    try
    {
        string rawConnectionString = ConfigurationManager.ConnectionStrings[connectionStringName].ConnectionString;
        string sqlconnectionstring = string.Format(rawConnectionString, database);
        using (SqlConnection sqlConnection = new SqlConnection(sqlconnectionstring))
        {
            string[] sqlComandTexts = valueElement.Value.Trim().Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
            string sqlQueryText = "";

            foreach (var sqlComandText in sqlComandTexts)
            {
                sqlQueryText += sqlComandText + "  for xml auto;";
            }

            sqlConnection.Open();
            SqlCommand sqlCommand = new SqlCommand(sqlQueryText, sqlConnection);

            using (XmlReader reader = sqlCommand.ExecuteXmlReader())
            {
                XElement xd = new XElement(new XElement("Response"));

                if (reader.EOF)
                {
                    return XElement.Parse("<Response/>");
                }
                else
                {
                    while (!reader.EOF)
                    {
                        if (reader.NodeType == XmlNodeType.Element)
                        {
                            var xe = reader.ReadOuterXml();
                            xd.Add(XElement.Parse(xe));
                        }
                        else
                        {
                            reader.Read();
                        }
                    }
                    return xd;
                }
            }
        }
    }

Answer 1:

而不是完全加载的每个元素的字符串表示,可以考虑使用XNode.ReadFrom()直接流式传输XML到一个新XElement

                if (reader.NodeType == XmlNodeType.Element)
                {
                    var element = XNode.ReadFrom(reader) as XElement;
                    if (element != null)
                        xd.Add(element);
                }
                else
                {
                    reader.Read();
                }

这将是比简单的使用ReadOuterXml()它使用一个临时XmlWriter到XML输入流中复制到输出StringWriter 。 但我无法预测的改善是否会不知道一些关于你的时间被下花了大量ReadOuterXml()



文章来源: Web API performance issues with large dynamic XML