3

Я пытаюсь вернуть изображение с сервера с помощью Silverlight 3. Сервер возвращает поток ответа, как это:Открытие в SilverLight

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 и Navigate не позволяет этого.

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

ответ

2

Правильный ответ: вы не можете, 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 оставалось в текущем состоянии, но на самом деле я его не тестировал.

BTW, note no Response.End(), это ужасная вещь, если вы можете избежать этого, тогда сделайте это.

+0

Спасибо, Энтони. Это действительно работает, и приложение SL сохраняет текущее состояние. Вопрос: В чем причина не использования Response.End()? –

+0

@John: Response.End() генерирует исключение ThreadAbortException и уничтожает любую последующую обработку ответа, включая любую пост-обработку, которая может произойти в модулях. Его гораздо лучше позволить коду прийти к своему естественному концу, чем резко убить его так резко. – AnthonyWJones

Смежные вопросы