2011-08-19 13 views
2

我試圖從PageMethod中觸發一個XML文件流的下載。我遵循文檔here從PageMethod觸發下載。什麼不正確?

[WebMethod] 
public static bool Export() 
{ 
    bool successful = false; 

    try 
    { 
     HttpContext.Current.Response.ContentType = "text/xml"; 
     HttpContext.Current.Response.ClearHeaders(); 
     HttpContext.Current.Response.AppendHeader("Content-Disposition", "attachment; filename=Dashboard.xml"); 

     HttpContext.Current.Response.Clear(); 
     HttpContext.Current.Response.BufferOutput = true; 

     SerializableDictionary<string, string> dataToSave = new SerializableDictionary<string, string>(); 

     foreach(var state in StateManager.StateDictionary) 
     { 
      var sessionItem = SessionRepository.Instance.GetSession(state.Value); 
      if (Equals(sessionItem, null)) continue; 

      using(MemoryStream memoryStream = new MemoryStream()) 
      { 
       XmlSerializer serializer = new XmlSerializer(sessionItem.GetType()); 
       serializer.Serialize(memoryStream, sessionItem); 
       dataToSave.Add(state.Value, Convert.ToBase64String(memoryStream.ToArray())); 
      } 
     } 

     XmlSerializer xmlSerializer = new XmlSerializer(dataToSave.GetType()); 

     using(MemoryStream memoryStream = new MemoryStream()) 
     { 
      xmlSerializer.Serialize(memoryStream, dataToSave); 
      HttpContext.Current.Response.AppendHeader("Content-Length", memoryStream.Length.ToString()); 

      memoryStream.Position = 0; 

      using(StreamReader streamReader = new StreamReader(memoryStream)) 
      { 
       HttpContext.Current.Response.Write(streamReader.ReadToEnd()); 
      } 
     } 

     HttpContext.Current.Response.Flush(); 

     successful = true; 
    } 
    catch (Exception exception) 
    { 
     _logger.ErrorFormat("Unable to serialize session. Reason: {0}", exception.Message); 
    } 

    return successful; 
} 

我沒有收到任何警告或錯誤。無需下載即可成功完成。

編輯:我試過application/xml和text/plain作爲ContentTypes,以及。

回答

2

您需要設置響應頭:

Response.AddHeader("content-disposition","attachment; filename=fname.ext") 
Response.AddHeader("Content-Length", data.Length.ToString()) 
+0

啊...可以解釋我怎麼能說出的文件了。讓我試試吧! –

+0

有沒有辦法獲得流的長度?看看我將序列化數據流保存到流中的行。 OutputStream.Length不可訪問,我相信。 –

+0

IIRC,您可以將數據序列化爲字符串,獲取字符串的長度,然後使用Response.Write將該字符串寫入響應。然後沖洗完成響應。 – gislikonrad