Я пытаюсь использовать RestSharp для загрузки изображения из службы WCF/Rest. Результат должен быть сохранен в файле и отображен в элементе управления изображением на странице WPF/SL.RestSharp - Загрузка/использование изображения в WPF/Silverlight
private void GetImage()
{
RestClient _Client = new RestClient(BASE_URI);
RestRequest request = new RestRequest("/api/img/{FileName}");
request.AddParameter("FileName", "dummy.jpg", ParameterType.UrlSegment);
_Client.ExecuteAsync<MemoryStream>(
request,
Response =>
{
if (Response != null)
{
var bitmapImage = new BitmapImage();
bitmapImage.BeginInit();
bitmapImage.StreamSource = Response.Data;
String fn = String.Format(@"c:\temp\{0}.jpg", Guid.NewGuid().ToString());
System.IO.File.WriteAllBytes(fn,Response.Data.ToArray());
bitmapImage.EndInit();
img.Source = bitmapImage;
}
});
}
Когда я смотрю в скрипаче, изображение загрузилось правильно, но изображение не сохраняется, и ничего не отображается. Исключено исключение. Какие-либо предложения ?
ОБНОВЛЕНО
Часть проблемы оказывается, что RestSharp не возвращает ожидаемый MemoryStream. Переход к другому методу и доступ к необработанным данным в формате byte [] решает часть проблемы, сохраняя picutere на диск.
private void GetImage()
{
RestClient _Client = new RestClient(BASE_URI);
RestRequest request = new RestRequest("/api/img/{FileName}");
request.AddParameter("FileName", "dummy.jpg", ParameterType.UrlSegment);
_Client.ExecuteAsync(
request,
Response =>
{
if (Response != null)
{
byte[] imageBytes = Response.RawBytes;
var bitmapImage = new BitmapImage();
bitmapImage.BeginInit();
bitmapImage.StreamSource = new MemoryStream(imageBytes);
bitmapImage.CreateOptions = BitmapCreateOptions.None;
bitmapImage.CacheOption = BitmapCacheOption.Default;
bitmapImage.EndInit();
JpegBitmapEncoder encoder = new JpegBitmapEncoder();
Guid photoID = System.Guid.NewGuid();
String photolocation = String.Format(@"c:\temp\{0}.jpg", Guid.NewGuid().ToString());
encoder.Frames.Add(BitmapFrame.Create(bitmapImage));
using (var filestream = new FileStream(photolocation, FileMode.Create))
encoder.Save(filestream);
this.Dispatcher.Invoke((Action)(() => { img.Source = bitmapImage; }));
;
}
});
}
Хотя вызов this.dispatcher.Invoke я все еще получаю ошибку: Вызывающий поток не может Acces этого объекта, потому что другой поток владеет.
upadted вопрос – Brilbroeder
Обновленный ответ тоже. Обратите внимание, что по-прежнему необходимо установить «BitmapCacheOption.OnLoad». – Clemens
Thx. Недостатком является .Freeze(). – Brilbroeder