3

我正在尝试使用 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 应用程序显示默认浏览器保存对话框?

4

1 回答 1

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(),这是一件可怕的事情,如果你可以避免它,那就这样做。

于 2010-03-25T11:24:04.107 回答