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,以及。
啊...可以解釋我怎麼能說出的文件了。讓我試試吧! –
有沒有辦法獲得流的長度?看看我將序列化數據流保存到流中的行。 OutputStream.Length不可訪問,我相信。 –
IIRC,您可以將數據序列化爲字符串,獲取字符串的長度,然後使用Response.Write將該字符串寫入響應。然後沖洗完成響應。 – gislikonrad