Служба WCF для получения изображения
-
01-07-2019 - |
Вопрос
Каков наилучший способ создать веб-сервис для приема изображения?Изображение может быть довольно большим, и я не хочу изменять размер приема по умолчанию для веб-приложения.Я написал тот, который принимает двоичное изображение, но я чувствую, что должна быть лучшая альтернатива.
Решение
Где "живет" это изображение? Доступно ли оно в локальной файловой системе или в Интернете?Если это так, я бы предложил, чтобы ваш веб-сервис принимал URI (может быть URL-адресом или локальным файлом) и открывал его как поток, а затем использовал StreamReader для чтения его содержимого.
Пример (но оберните исключения в FaultExceptions и добавьте FaultContractAttributes):
using System.Drawing;
using System.IO;
using System.Net;
using System.Net.Sockets;
[OperationContract]
public void FetchImage(Uri url)
{
// Validate url
if (url == null)
{
throw new ArgumentNullException(url);
}
// If the service doesn't know how to resolve relative URI paths
/*if (!uri.IsAbsoluteUri)
{
throw new ArgumentException("Must be absolute.", url);
}*/
// Download and load the image
Image image = new Func<Bitmap>(() =>
{
try
{
using (WebClient downloader = new WebClient())
{
return new Bitmap(downloader.OpenRead(url));
}
}
catch (ArgumentException exception)
{
throw new ResourceNotImageException(url, exception);
}
catch (WebException exception)
{
throw new ImageDownloadFailedException(url, exception);
}
// IOException and SocketException are not wrapped by WebException :(
catch (IOException exception)
{
throw new ImageDownloadFailedException(url, exception);
}
catch (SocketException exception)
{
throw new ImageDownloadFailedException(url, exception);
}
})();
// Do something with image
}
Другие советы
Разве вы не можете загрузить изображение на сервер с помощью FTP, а затем, когда это будет сделано, сервер (и, следовательно, служба WCF) сможет легко получить к нему доступ?Таким образом, вам не нужно думать о настройках размера приема и т.д.
По крайней мере, именно так я это сделал.