.net会话变量在请求后被清除

时间:2013-11-21 12:40:44

标签: .net validation extjs svg session-variables


EDITION&解决方案: 花了好几个小时来解决这个问题,我意识到Extjs图表保存方法在下载文件时卸载页面。由于我在用户关闭页面时清除会话变量,因此我的会话变量会自动清除。 我很抱歉不合适的问题

现在这个下载方法触发我的会话清除功能更加尴尬但是在我的本地主机上它会在服务器上没有取消时立即取消。


原始问题: 我在我的MVC3项目中使用Extjs图表。我正在尝试使用他们的保存方法保存图表。图表将数据发送到“http://svg.sencha.io/”以根据我的请求mimetype呈现并给出响应。

为了给图表提供自定义名称,我编写了自己的代码来获取svg图像并将其转换为png。我将原始数据导向了我的服务器。它运作良好。我可以将图像保存为png文件并提供自定义名称。但是,此请求会清除我的会话变量。我认为输入验证可能会导致丢失会话数据,我尝试了[ValidateInput(false)]标头和Request.Unvalidated.Form["input"]。每次结果都是一样的。我认为这与输入验证有关。我该怎么做才能克服会话问题。我不想为所有方法禁用InputValidation。您可以在下面找到我的代码。

服务器c#:

 public void imageConverter(int width, int height, string type)
    {
        try
        {
            string svg = Request.Unvalidated.Form["svg"];
            string dateStr = DateTime.Today.ToString("yyyyMMdd");

            byte[] bytes = new byte[svg.Length * sizeof(char)];
            System.Buffer.BlockCopy(svg.ToCharArray(), 0, bytes, 0, bytes.Length);

            MagickReadSettings settings = new MagickReadSettings();
            settings.Width = width;
            settings.Height = height;
            settings.Format = ImageMagick.MagickFormat.Svg;
            using (MagickImage image = new MagickImage(bytes,settings))
            {
                image.Format = MagickFormat.Png;
                byte[] data = image.ToByteArray();

                Response.ContentType = type;
                Response.AddHeader("Content-Disposition", "attachment; filename=\"" + dateStr + "\"");
                Response.BinaryWrite(data);
                Response.End();
            }
        }
        catch (Exception ex)
        {
        }
    }

ExtJS代码:

myButton.on('click', function (button, e, eOpts) {
        Ext.MessageBox.confirm('Sure?', 'Save as?', function (choice) {
            if (choice == 'yes') {
                Ext.draw.engine.ImageExporter.defaultUrl ='/Statistics/imageConverter';
                myChart.save({
                    type: 'image/png'
                });
            }
        });
    });

1 个答案:

答案 0 :(得分:2)

我不是MVC大师,但我有一点可以帮助你(如果你使用基于cookie的会话)。但起初仍有一些悬而未决的问题:

会话在MVC会话存储中是否发生了变化,或者只是cookie更改/丢失了?您是否比较了请求的cookie和响应?

如果它仅适用于cookie,只需将cookie自己添加到响应cookie集合中。您可以创建新的或只是将它们从请求复制到响应。

// supposed to run in a MVC controller
foreach (System.Web.HttpCookie c in this.Request.Cookies)
{
    this.Response.Cookies.Add(c);
}
相关问题