我正在尝试使用Silverlight 3从服务器返回图像。服务器返回响应流,如下所示:
context.Response.ContentType = imageFactory.ContentType
imgStream.WriteTo(context.Response.OutputStream)
imgStream.Close()
context.Response.End()
在Silverlight客户端上,我处理的流如下:
Dim request As HttpWebRequest = result.AsyncState
Dim response As HttpWebResponse = request.EndGetResponse(result)
Dim responseStream As IO.Stream = response.GetResponseStream()
我想获取该流并打开浏览器保存对话框,我探索过的一个选项是使用Html.Window.Navigate(New Uri(“image url”)),这打开了正确的浏览器默认对话框,但它是不是一个选项,因为我需要通过HttpRequest.Headers.Item向服务器发送扩展信息(例如XML),并且Navigate不允许这样做。
如何在不使用Html.Window.Navigate(New Uri(“image url”))的情况下从Silverlight应用程序中获取响应流并强制显示默认浏览器“保存”对话框?
答案 0 :(得分:2)
直接的答案是你不能,Silverlight SaveFileDialog只能作为用户交互的直接结果打开,例如点击按钮。
此类问题的解决方案(您希望上传的地方)是将XML发布到服务器以便存储在会话对象或文件中。响应是一些可用于检索XML的句柄,例如GUID。
然后,您可以使用标准导航将GUID放在URL的查询字符串中。接收脚本(在这种情况下为ashx)可以使用URL中提供的句柄检索先前发布的XML。
您还需要像这样对服务器端响应进行编码: -
context.Response.ContentType = imageFactory.ContentType;
context.Response.AddHeader("Content-Disposition", "attachment;file=someimage.jpg");
imgStream.WriteTo(context.Response.OutputStream);
imgStream.Close();
这将导致浏览器显示“打开或保存对话框”。通常情况下,当前窗口的导航状态会保持不变,因此SL应用程序应保持其当前状态,但我实际上并没有对其进行测试。
顺便说一句,请注意没有Response.End(),这是一件非常糟糕的事情,如果你可以避免它,那么就这样做。