【问题标题】:Writing XML file to Users Browser and download将 XML 文件写入用户浏览器并下载
【发布时间】:2017-01-13 02:29:59
【问题描述】:

我正在将 XML 数据写入用户浏览器以供下载。 下面是代码

受保护的无效 WriteXmlToPageDownload(XElement XmlCustomerData) {

        try
        {
            if (XmlCustomerData != null)
            {

                XDocument x = new XDocument(new XDeclaration("1.0", "UTF-8", "yes"), new XElement(XmlCustomerData));
                StringBuilder builder = new StringBuilder();
                StringWriter writer = new StringWriter(builder);

                x.Save(writer);
                writer.Flush();
                HttpContext context = HttpContext.Current;
                context.Response.Write(builder.ToString().Replace("encoding=\"utf-16\"", "encoding=\"utf-8\""));
                context.Response.ContentType = "application/xml";
                string filename = "CustomerDetails ";
                context.Response.AppendHeader("Content-Disposition", "attachment; filename=" + filename + ".xml");
                context.Response.AppendHeader("Connection", "close");
                context.Response.End();

            }

        }
        catch (Exception ex)
        {
            Log("Exception in CustomerData" + ex.Message.ToString(), this);
        }
    } 

XmlCustomerData 包含由 XElement 创建的 XML(一些业务逻辑...) 以下是所需的 XML 示例

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<Customers>
  <Customer>

 <deatils name="ABC">
    <id="1">
     </details>
 <deatils name="XYZ">
    <id="2">
 </details>
   ...
</Customer>
</Customers>

并且 XmlCustomerData 包含保持完整的业务逻辑

<Customers>...</Customers>

问题是。 1.XML被创建,也没有被下载到用户浏览器 2.我得到了例外 “无法计算表达式,因为代码已优化或本机框架位于调用堆栈顶部。”

我的要求是将 XML 文件下载到用户的浏览器。 请让我知道我在做什么错误或更好的方法

提前致谢。

【问题讨论】:

    标签: c# xml download httpcontext xelement


    【解决方案1】:

    一旦您将 xml 数据加载到 XDocument 然后代码

    StringBuilder builder = new StringBuilder();
    StringWriter writer = new StringWriter(builder);
    

    可以替换为

    x.Save(context.Response.OutputStream);
    

    类似代码的快速模型,下面的代码会在要求用户保存或打开附件后下载xml内容。该代码包含在 Http Handler ashx 文件中。

    /// <summary>
    /// Summary description for Handler1
    /// </summary>
    public class Handler1 : IHttpHandler
    {
    
        public void ProcessRequest(HttpContext context)
        {
            string xml =
                @"<?xml version=""1.0""?>
                <Customers>
                    <Customer>
                        <details>
                            <id/>
                        </details>
                        <details>
                            <id/>
                        </details>
                    </Customer>
                </Customers>";
    
            XElement xel = XElement.Parse(xml);
            XDocument x = new XDocument(new XDeclaration("1.0", "UTF-8", "yes"), new XElement(xel));
    
            context.Response.ContentType = "application/xml";
            context.Response.AppendHeader("Content-Disposition", "attachment; filename=Test.xml");
            context.Response.AddHeader("Content-Length", xml.Length.ToString());
            x.Save(context.Response.OutputStream);
        }
    
        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
    

    此代码直接在网页上显示 xml。该代码包含在 Http Handler ashx 文件中。

    /// <summary>
    /// Summary description for Handler2
    /// </summary>
    public class Handler2 : IHttpHandler
    {
    
        public void ProcessRequest(HttpContext context)
        {
            string xml =
                @"<?xml version=""1.0""?>
                <Customers>
                    <Customer>
                        <details>
                            <id/>
                        </details>
                        <details>
                            <id/>
                        </details>
                    </Customer>
                </Customers>";
    
            XElement xel = XElement.Parse(xml);
            XDocument x = new XDocument(new XDeclaration("1.0", "UTF-8", "yes"), new XElement(xel));
    
            context.Response.ContentType = "application/xml";
            context.Response.AddHeader("Content-Length", xml.Length.ToString());
            x.Save(context.Response.OutputStream);
        }
    
        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-16
      • 2019-01-18
      • 2015-03-03
      • 2014-10-27
      相关资源
      最近更新 更多