Вступительный поток отклика в Silverlight
-
22-09-2019 - |
Вопрос
Я пытаюсь вернуть изображение с сервера с помощью 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 (новый URI («URL -адрес изображения»)), и это открыло правильный диалог по умолчанию браузера, но это не вариант. Потому что мне нужно отправить расширенную информацию (например, XML) на сервер через httprequest.headers.item, и навигация не допускает этого.
Как я могу взять поток ответов и заставить диалоговое окно «Сохранить браузер по умолчанию» появиться из приложения Silverlight без использования html.window.navigate (новый URI («URL Image URL»))?
Решение
Прямой ответ - это вы не можете, 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 должно оставаться в его текущем состоянии, но я на самом деле не проверяю это.
Кстати, обратите внимание на ответ.