由于中间层 Asp.Net,将 Xml 输出从存储过程传递到 AJAX 客户端(Web 浏览器),开销(内存、处理时间)

本文关键字:浏览器 AJAX Web 客户端 开销 时间 处理 内存 Net Asp 中间层 | 更新日期: 2023-09-27 17:56:34

我正在使用JQuery对用C#编写的WebService执行异步调用。Web 服务调用存储过程(位于 SQL Server 数据库中)。存储过程将结果作为 XML 返回(我在过程中使用"for xml"以 XML 格式检索结果)。

问题是:如何将存储过程返回的 XML(由 SQL Server 流式传输)放在 Web 服务的 HTTP 响应流上,内存和处理时间使用量最少。

目前,我的WebService返回XmlDocument对象。我想知道是否有办法减少创建 XmlDocument 或数据集对象的开销,这些开销会消耗内存和处理器时间。

理想的解决方案是:将结果流管道从 SQL Server 连接到 HTTP 响应流管道。这样,来自 SQL Server 的任何内容都将到达客户端,而不会触及内容。不会创建新对象(如 DataSet、XmlDocument),并且在创建 XmlDocuments 时避免了 XmlAnalysis 。从而将内存和处理占用空间降至最低。此外,无论过程返回的 XML 是小还是很大,由于使用了流,内存使用量都不会增长(创建 XmlDocuments 就是这种情况)。

我的简化 c# 网络服务方法:

public XmlDocument GetXmlDataFromDB()
{
    string connStr = System.Convert.ToString(
            System.Web.Compilation.ConnectionStringsExpressionBuilder.GetConnectionString("DbConnectionString"),
            System.Globalization.CultureInfo.CurrentCulture);
    SqlConnection conn = new SqlConnection(connStr);
    SqlCommand sqlCmd = new SqlCommand("stp_GetXmlData", conn);
    sqlCmd.CommandType = CommandType.StoredProcedure;
    SqlDataAdapter sda = new SqlDataAdapter(sqlCmd);
    DataSet ds = new DataSet();
    conn.Open();
    XmlReader xmlReader = sqlCmd.ExecuteXmlReader();
    while (xmlReader.Read())
    {
        ds.ReadXml(xmlReader);
    }
    conn.Close();
    XmlDocument xmlDoc = new XmlDocument();
    xmlDoc.InnerXml = ds.GetXml();
    return xmlDoc;
}

有什么建议可以提高上述代码的性能吗?

由于中间层 Asp.Net,将 Xml 输出从存储过程传递到 AJAX 客户端(Web 浏览器),开销(内存、处理时间)

在你的代码中,你不需要DataSet、SqlDataAdapter和InnerXml

var doc = new XmlDocument();
...
var reader = cmd.ExecuteXmlReader();
if (reader.Read())
 doc.Load(reader);

或者,您可以使用reader.ReadOuterXml()将xml作为字符串获取,而无需构造文档。

您还可以考虑将 WCF 服务用于 ASP.NET AJAX

强制性警告:

"我们应该忘记小 效率,比如说大约 97% 的 时间:过早优化是 万恶之源" - 唐纳德·高德纳

话虽如此,您可以让 SQL Server 返回字符串而不是xml类型,例如:

; with Query(XmlColumn) as
        (
        SELECT  *
        FROM    YourTable
        for xml auto
        )
select  cast(XmlColumn as varchar(max)) as StringColumn
from    Query

构造withfor xml结果命名。 您可以使用 Response.Write 将生成的varchar(max)列流式传输回客户端。 这将避免 ASP.NET 中间层中的任何解析或对象构造。