2017-05-29 79 views
0

所以我被要求有选项从数据库下载/创建一个XML文件。该表包含一个包含原始XML消息的列。用户需要能够保存XML文档以供查看。使用来自数据库的StreamWriter创建XML文档

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

所以我创建了一个存储的Proc来调用XML Message = QueueId。

该按钮位于一个DataGrid(我们使用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或服务器跟踪已启用来修改响应时。

详细信息:错误解析'< Test xmlns =“”/> <!D'附近。

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

+0

能否请你错误的文本复制到岗位,而不是上传完整的图像? –

+0

@NoelWidmer嗨,对不起,不想让这个帖子谋杀很久,编辑帖子 – Flipoff94

+0

当然没问题。如果他们不必在另一个网站上的图像上搜索错误,那对每个人来说都会更容易。 –

回答

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;"); 
     } 
    } 
` 

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

希望这可以帮助某个地方的人。我到处寻找这个该死的答案,不得不结合一大堆东西来使它工作。 是的,有多种方法可以做到这一点。

好运和快乐编码 翻转 - OUT

0

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

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

set_enableAJAX(假)

会寄我固定在一个单独的答案并标出一个