从PageMethod触发下载。什么不对?

时间:2011-08-19 21:59:58

标签: c# serialization

我试图从PageMethod触发XML文件流的下载。我按照文档here

进行了操作
[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。

1 个答案:

答案 0 :(得分:2)

您需要设置响应标头:

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