使用来自数据库的 StreamWriter 创建 XML 文档

Creating XML Document with StreamWriter from DB

所以我被要求可以选择从数据库中 download/create 一个 XML 文件。 table 包含一个包含原始 XML 消息的列。用户需要能够保存 XML 文档以供查看。

所以我在一个单独的程序中测试了我的下载,它可以正常工作,完美地下载和创建 XML Doc,但由于某些原因它不会 download/create 在实际程序中。

所以我创建了一个存储过程来调用 XML Message = 到 QueueId。

按钮位于数据网格中(我们使用的是 Telerik)

所以我正在使用 MemoryStream 和流编写器将 XML 写入文档。这是我的代码:

    private void DownloadXml()
    {
        try
        {
            MemoryStream stream = null;

            if (grdMessages.SelectedItems.Count > 0)
            {

                foreach (GridDataItem item in grdMessages.SelectedItems)
                {
                    int queueId = int.Parse(item["QueueId"].Text);

                    ibis_GetXmlTextResult result = Client.IbisGetClient(Endpoint).ibis_GetXmlText(queueId);
                    stream = new MemoryStream();
                    var r = result.XmlMessage.ToString();

                    //r = "Hello this is my file:)"; //This was only to test it if worked
                    using (StreamWriter writer = new StreamWriter(stream))
                    {
                        writer.Write(r);
                        writer.Flush();
                    }
                    WriteToPage(stream.ToArray(), "text/plain; charset=UTF-8", string.Format("{0}_ClientXml.xml", queueId));
                    //WriteToPage(stream.ToArray(), "text/xml; charset=UTF-8", "ClientXml.xml");
                }
            }
        }
        catch (Exception ex)
        {
            LogException(ex, "Demand Filter", "Well that didn't work. Check for error " + ex.StackTrace);
        }
    }


    private void WriteToPage(byte[] data, string contentType, string fileName)
    {
        HttpResponse response = Page.Response;

        response.Clear();
        response.ClearContent();
        response.ClearHeaders();

        response.Buffer = true;

        response.AddHeader("Content-Disposition", string.Format("Attachment; filename=\"{0}\"", fileName));
        response.ContentType = contentType;

        response.BinaryWrite(data);

        response.Flush();
        HttpContext.Current.ApplicationInstance.CompleteRequest();
        //response.End();
    }

所以我可以看到它收到 XML 消息,但是当我检查控制台时出现此错误,我收到此错误: http://i.imgur.com/VppKLhG.png

编辑给出的错误:

错误:Sys.WebForms.PageRequestManagerParserErrorException:无法解析从服务器收到的消息。此错误的常见原因是通过调用 Response.Write()、响应过滤器、HttpModules 或启用服务器跟踪来修改响应。

详细信息:在“ < !D' 附近解析时出错。

在 Fiddler 中我可以看到原始的 XML 消息,但是 1.) 它没有下载,2.) 它在我的 XML 消息的末尾添加了一大堆废话单独的程序不行。

在这里回答我自己的问题。 弄清楚问题是什么,所以这是我的发现。在这个网站上找到答案: itemcommand to not do async postback

问题是,当您单击 GridColumnButton 时,回发阻止了它的下载。 所以基本上你需要防止按钮做 postback 并且你需要设置为

set_enableAJAX(假)

将 post 我在单独的答案中修复的内容并标记那个

所以这是我修复它的方法

问题出在我的 GridButtonColumn

 private void DownloadXml()
    {
        try
        {
            MemoryStream stream = null;

            if (grdMessages.SelectedItems.Count > 0)
            {

                foreach (GridDataItem item in grdMessages.SelectedItems)
                {
                    int queueId = int.Parse(item["QueueId"].Text);

                    ibis_GetXmlTextResult result = Client.IbisGetClient(Endpoint).ibis_GetXmlText(queueId);
                    stream = new MemoryStream();
                    var r = result.XmlMessage.ToString();

                    //r = "Hello this is my file:)";
                    using (StreamWriter writer = new StreamWriter(stream))
                    {
                        writer.Write(r);
                        writer.Flush();
                    }
                    WriteToPage(stream.ToArray(), "text/xml; charset=UTF-8", string.Format("{0}_ClientXml.xml", queueId));
            }
        }
        catch (Exception ex)
        {
            LogException(ex, "Demand Filter", "Well that didn't work. Check for error " + ex.StackTrace);
        }
    }

这里是 WriteToPage()

        private void WriteToPage(byte[] data, string contentType, string fileName)
    {
        HttpResponse response = Page.Response;

        response.Clear();
        response.ClearContent();
        response.ClearHeaders();

        response.Buffer = true;

        response.AddHeader("Content-Disposition", string.Format("Attachment; filename=\"{0}\"", fileName));
        response.ContentType = contentType;

        response.BinaryWrite(data);

        response.Flush();
        response.End();
    }

在我看来,我必须添加一些内容。为了让我的脚本工作,我必须将它添加到我的 RadAjaxManager(注意我正在使用 Telerik

`

<telerik:RadAjaxManager ID="RadAjaxManager1" runat="server" UpdatePanelsRenderMode ="Inline" DefaultLoadingPanelID="AjaxLoadingPanel">
            <AjaxSettings> 
            <telerik:AjaxSetting AjaxControlID="RadGrid1"> 
                <UpdatedControls> 
                    <telerik:AjaxUpdatedControl ControlID="RadGrid1" /> 
                </UpdatedControls> 
            </telerik:AjaxSetting> 
        </AjaxSettings>
     </telerik:RadAjaxManager>

`

这是我在视图中使用的脚本

`

    <telerik:radscriptblock id="RadScriptBlock1" runat="server"> 
    <script type="text/javascript">

        function onTabSelecting(sender, args)
        {
            if (args.get_tab().get_pageViewID())
            {
                args.get_tab().set_postBack(false);
            }
        }

        function RadGrid1_Command(sender, args)
        {
            var commandName = args.get_commandName();

            if (commandName == "DownloadXml") {
                $find("<%= RadAjaxManager1.ClientID %>").set_enableAJAX(false);
            }       
        }    
    </script>
</telerik:radscriptblock>

`

然后是咬我屁股的该死的土豆。

`protected void grdMessages_ItemCreated(object sender, GridItemEventArgs e)
    {
        if (e.Item is GridDataItem)
        {
            GridDataItem item = (GridDataItem)e.Item;
            LinkButton btnXML = (LinkButton)item["DownloadXml"].Controls[0];
            btnXML.Click += new EventHandler(btnXML_Click);
            btnXML.Attributes.Add("OnClick", "DownloadXML(); return false;");
        }
    }
`

所以我唯一需要的就是属性中的 "return false;"。

希望这对在线某个地方的人有所帮助。我到处寻找该死的答案,不得不结合一堆废话才能让它发挥作用。 是的,有多种方法可以做到这一点。

祝你编程愉快 翻转 - OUT