Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何缓存XmlTextWriter数据?_C#_.net_Asp.net_Xml - Fatal编程技术网

C# 如何缓存XmlTextWriter数据?

C# 如何缓存XmlTextWriter数据?,c#,.net,asp.net,xml,C#,.net,Asp.net,Xml,我有一个页面,我只是在屏幕上写了一堆XML数据。它正在进行多个数据库调用以获取所有数据: XmlTextWriter writer = new XmlTextWriter(Response.OutputStream, Encoding.UTF8); writer.WriteStartDocument(); writer.WriteStartElement("rss"); writer.WriteAttributeString("version", "2.0"); writer.WriteSt

我有一个页面,我只是在屏幕上写了一堆XML数据。它正在进行多个数据库调用以获取所有数据:

XmlTextWriter writer = new XmlTextWriter(Response.OutputStream, Encoding.UTF8);
writer.WriteStartDocument();

writer.WriteStartElement("rss");
writer.WriteAttributeString("version", "2.0");

writer.WriteStartElement("channel");
writer.WriteElementString("title", "MyTitle");
writer.WriteElementString("link", "http://www.mysite.com/");

using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))
{
    SqlCommand cmd = new SqlCommand("SELECT * FROM vwXMLFeedData", conn);

    conn.Open();

    using (SqlDataReader rdr = cmd.ExecuteReader())
    {
        while (rdr.Read())
        {
            writer.WriteStartElement("item");
            writer.WriteElementString("title", rdr["Title"].ToString());
            writer.WriteElementString("link", rdr["URL"].ToString());
            writer.WriteEndElement();
        }
    }
}

writer.WriteEndElement();
writer.WriteEndElement();
writer.WriteEndDocument();
writer.Close();  

我希望缓存所有XML数据,这样就不必每次都进行数据库调用,但我不确定如何使用XmlTextWriter来实现这一点。这里最好的策略是什么

我建议您不要试图找出如何缓存XmlTextWriter,而是换一种方式来看待它

例如,您可以写入临时位置,然后为来自该位置的后续请求提供服务


您需要弄清楚如何检测缓存的数据是否旧

使用-可以将其转换为缓存字符串,然后将其输出到
OutputStream
中,而不是写入
响应。OutputStream
,如果要将其缓存在内存中,则可以创建
MemoryStream
并写入。因此,初始化编写器的代码将变成:

MemoryStream CacheStream = new MemoryStream();
XmlTextWriter writer = new XmlTextWriter(CacheStream, Encoding.UTF8);
填充流的代码保持不变,除非在关闭写入程序之前,需要保存流的缓冲区和大小:

writer.Flush();
long CachedDataSize = CacheStream.Position;
byte[] CachedData = CacheStream.Buffer;
writer.Close();
或者,如果要缓存到文件,只需创建一个
FileStream
,然后将XML写入其中


在任何一种情况下,只要您想向用户发送信息,您就可以从缓存的数据中读取信息。

您所要求的——一种避免进行数据库调用的方法——主要意味着缓存数据库结果,而不是XmlTextWriter输出

如何缓存这些结果取决于您。如果这些db查询结果实际上只有一个呈现—也就是说,如果只使用结果来发出XML,然后对这些结果不做任何其他操作—那么缓存XML输出相当于直接缓存数据库查询结果

仅缓存结果的一种方法是执行以下操作:

private Dictionary<String,String> cache;
private void FillCache()
{
    using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))
    {
        SqlCommand cmd = new SqlCommand("SELECT * FROM vwXMLFeedData", conn);

        conn.Open();
        cache = new Dictionary<String,String>();
        using (SqlDataReader rdr = cmd.ExecuteReader())
        {
            while (rdr.Read())
            {
                cache.Add(rdr["Title"].ToString(), rdr["URL"].ToString());
            }
        }
    }
}

仅供参考,您不应使用
新XmlTextWriter()
。自.NET 2.0以来,它一直被弃用。改用
XmlWriter.Create()
XmlTextWriter writer = new XmlTextWriter(Response.OutputStream, Encoding.UTF8);
writer.WriteStartDocument();

writer.WriteStartElement("rss");
writer.WriteAttributeString("version", "2.0");

writer.WriteStartElement("channel");
writer.WriteElementString("title", "MyTitle");
writer.WriteElementString("link", "http://www.mysite.com/");
if (cache==null)
    FillCache();

foreach (var kvp in  cache)
{
    writer.WriteStartElement("item");
    writer.WriteElementString("title", kvp.Key);
    writer.WriteElementString("link", kvp.Value);
    writer.WriteEndElement();
}

writer.WriteEndElement();
writer.WriteEndElement();
writer.WriteEndDocument();
writer.Close();