使用StreamWriter从DB创建XML文档

时间:2017-05-29 12:06:41

标签: c# xml streamwriter memorystream

因此我被要求可以选择从数据库下载/创建XML文件。该表包含一个包含原始XML消息的列。用户需要能够保存XML文档以供查看。

所以我在一个单独的程序中测试了我的下载,它可以完美地工作,下载和创建XML Doc,但出于某种原因,WONT在实际程序中下载/创建。

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

Button位于数据网格中(我们正在使用Telerik)

所以我使用MemoryStream和一个streamwriter将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或服务器跟踪来修改响应时。

详情:在'附近解析时出错<测试xmlns =" " /> < !d&#39 ;.

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

2 个答案:

答案 0 :(得分:0)

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

问题是,当您单击GridColumnButton时,Postback阻止它下载。 所以基本上你需要阻止按钮进行回发,你需要设置为

set_enableAJAX(假)

将我在单独答案中修改的内容发布并标记为

答案 1 :(得分:0)

所以这就是我所做的修复

问题在于我的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;");
        }
    }
`

所以我唯一需要的就是“回归假”;在属性。

希望这可以帮助某人在线。我到处寻找这个该死的答案,不得不将一堆垃圾组合起来才能使它发挥作用。 是的,有多种方法可以做到。

Goodluck和Happy Coding 翻转