返回XML的API。我可以使用XmlTextWriter,这会比创建XmlDocument更快

时间:2015-11-20 13:36:13

标签: c# xml vb.net api

目前正在编写一个返回一些XML的.ashx文件。这是我在ProcessRequest sub

中实际做的事情
Dim xml As XmlDocument = getXML(context.Request.QueryString("products"))
xml.Save(context.Response.Output)

我想知道我是否也可以某种方式使用XmlTextWriter,如果是这样会更好/更快?

速度是迄今为止最重要的因素,但我对VB.net中的编程非常陌生,所以如果还有其他我应该知道的其他内容请告诉我。

Xml内容,任何人都有兴趣...这是这个,但有可能返回最多46个产品。

<?xml version="1.0" encoding="utf-8"?>
<products>
      <product>
        <id>58</id>
        <prices />
        <instock>True</instock>
        <shipping> - This product will ship today if ordered within the next 2 hours and 46 minutes.</shipping>
      </product>
      <product>
        <id>59</id>
        <prices />
        <instock>False</instock>
        <shipping>This product will be in stock soon</shipping>
      </product>
</products>

1 个答案:

答案 0 :(得分:1)

我认为首先关注的是如何序列化XML。最多46个产品似乎不是非常大量的数据,因此更快地序列化或更有效地处理内存的效果不是太大。

相反,我建议尽可能缓存输出。如果数据不依赖于用户且不经常更改,则可以将结果存储在缓存中并从那里进行服务。而不是将XmlDocument存储在缓存中,而是存储序列化版本,以便您只需将字符串写入响应。以下示例显示了如何使用缓存:

public void ProcessRequest(HttpContext context)
{
    string productsKey = context.Request.QueryString("products");
    string cacheKey = "Products_" + productsKey;
    if (context.Cache[cacheKey] == null)
    {
        // lockObj declared on class level as 
        // private static readonly lockObj = new object();
        lock(lockObj)             {
            if (context.Cache[cacheKey] == null)
            {
                 using(StringWriter writer = new StringWriter())
                 {
                     var doc = getXml(productskey);
                     doc.Save(writer);
                     // Set caching options as required
                     context.Cache.Add(cacheKey, writer.GetStringBuilder().ToString(), null, Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(10));
                 }
            }
        }
        context.Response.Write(context.Cache[cacheKey]);
        return;
    }

有关Cache类的详细信息,请参阅此link