【问题标题】:ASP.NET MVC Export XML based on XML-Schema基于 XML-Schema 的 ASP.NET MVC 导出 XML
【发布时间】:2015-12-21 16:23:17
【问题描述】:

基于给定的 XML-Schema,我想创建一个 XML-Document 并将其作为 MVC 5 应用程序中的下载提供。我在应用程序中使用 EF 和 Linq to Entity。我不确定使用哪种方法来创建 XML 文件。知道什么最适合我的需要吗?:

  • XMLWriter
  • XML 文档
  • Linq to XML
  • 类型化的数据集

导出的 XML 文件(基于旧文件)大约有 500KB,我有大约 2500 个用户。并非所有用户都会同时下载他们的 XML 文件,但我也不知道有多少用户会同时下载该文件。我应该在内存中创建文件(通过使用 MemoryStream 或类型化的 DataSet)还是应该先将其写入磁盘(FileStream 和 XMLWriter/XMLDocument)然后提供下载?

更新
- 将为每个用户生成不同的 xml 文件
- 应用程序将在本地托管

【问题讨论】:

    标签: c# xml asp.net-mvc linq xsd


    【解决方案1】:

    我建议你使用 XmlSerializer。

    首先将类定义为可序列化

    [Serializable]
    public class MyClass
    {
        public string Property { get; set; }
    }
    

    然后使用XmlSerializer:

    using System.Xml.Serialization;
    
    var serializer = new XmlSerializer(typeof(MyClasse));
    var xmlString = serializer.Serializer(new MyClass);
    

    如果您正在使用云,请将此 Xml 文件保存在 S3 中(对于 AWS)或 Blob(对于 Azure)。

    如果您使用的是单个服务器,请在内存中为此文件创建缓存,您可以使用OutputCache 属性非常轻松地创建缓存。类似的东西:

    [OutputCache(Duration = 360/*seconds*/)]
    public ActionResult CreateXml()
    {
        //code here
    }
    

    使用OutputCache,您有 3 种方法来定义使请求与其他请求不同的原因,它们是:

    • VaryByCustom => 表示自定义输出缓存要求的任何文本。
    • VaryByHeader => 以分号分隔的 HTTP 标头列表,用于改变输出缓存。
    • VaryByParam => 以分号分隔的字符串列表,对应于 GET 方法的查询字符串值或 POST 方法的参数值。

    XmlDataSet 与 XmlSerializer 的示例:https://dotnetfiddle.net/5dzcP4

    【讨论】:

    • 嗨,阿尔贝托!因此,您建议我创建一个 POCO 类,用所需的数据填充该类,然后将该类序列化为 XML。这种方法在某种程度上与类型化的 DataSet 不相似吗?正如我所提到的,我已经有了 XSD 文件,因此我可以轻松地创建一个类型化的 DataSet,然后使用 WriteXML() 方法来创建文件。使用 XmlSerializer 有什么好处?该应用程序将是自托管的(在本地),因此我可以使用 OutputCache 属性,但因为我必须为每个用户生成不同的 xml 文件,所以我不确定缓存在这种情况下是否真的对我有帮助。跨度>
    • 我通过一些改进改变了我的问题。我更喜欢 XmlSerializer,因为它比数据集更容易工作,更少的代码行,也更快,更灵活,但如果你对数据集更满意,请继续使用它。关于每个用户的输出缓存,我在问题中添加了 3 种可用于使请求不同的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-11
    • 1970-01-01
    • 1970-01-01
    • 2019-12-17
    • 2016-02-03
    相关资源
    最近更新 更多