Открытие потока ответов в Silverlight - PullRequest
3 голосов
/ 25 марта 2010

Я пытаюсь вернуть изображение с сервера, используя 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 ("URL-адрес изображения")), и при этом открывается правильный диалог браузера по умолчанию, но не вариант, потому что мне нужно отправлять расширенную информацию (например, XML) на сервер через HttpRequest.Headers.Item, а навигация не позволяет этого.

Как я могу взять поток ответов и заставить диалоговое окно Сохранить браузера по умолчанию появляться из приложения Silverlight без использования Html.Window.Navigate (New Uri ("url-изображение"))?

1 Ответ

2 голосов
/ 25 марта 2010

Прямой ответ: вы не можете, Silverlight SaveFileDialog может быть открыт только как прямой результат взаимодействия с пользователем, такого как нажатие кнопки.

Решение проблемы такого рода (где вы хотите загрузить файл) - отправить XML на сервер для хранения, скажем, в объекте сеанса или в виде файла. Ответ - это некоторый дескриптор, который вы можете использовать для получения XML, например GUID.

Затем можно использовать стандартную навигацию, поместив GUID в строку запроса URL-адреса. Принимающий скрипт (в данном случае ashx) может извлечь ранее отправленный XML, используя дескриптор, указанный в URL.

Вы также захотите закодировать ответ на стороне сервера следующим образом: -

context.Response.ContentType = imageFactory.ContentType;
context.Response.AddHeader("Content-Disposition", "attachment;file=someimage.jpg"); 
imgStream.WriteTo(context.Response.OutputStream);
imgStream.Close();

это заставит браузер отобразить «Открыть или сохранить диалог». Обычно состояние навигации текущего окна поддерживается, поэтому ваше SL-приложение должно оставаться в его текущем состоянии, но я на самом деле не проверял это.

Кстати, обратите внимание, нет Response.End (), это ужасно, если вы можете избежать этого, то сделайте это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...