2017-05-29 72 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(假)

會寄我固定在一個單獨的答案並標出一個