#wcf #asp.net-mvc-2 #wcf-rest
#wcf #asp.net-mvc-2 #wcf-rest
Вопрос:
У меня есть существующее ASP.NET Клиентское приложение MVC 2, которое использует приложение-службу RESTful WCF для сохранения данных. Появилось новое требование для поддержки изображения, прикрепленного / связанного с одним из моих существующих объектов домена (Product).
В настоящее время клиентское приложение вызывает службу для получения списка продуктов (в виде списка облегченных объектов ProductInfo) и отображает список пользователю. Когда пользователь нажимает на элемент в списке, клиент вызывает службу, чтобы получить конкретный объект Product, который поддерживает редактирование пользователем. После сохранения клиент отправляет обновленный продукт в службу для сохранения.
Новое требование требует, чтобы я отображал связанное изображение в списке, а также разрешал пользователю устанавливать / заменять изображение при редактировании продукта. Текущее изображение также отображается в редакторе продукта. С каждым продуктом будет связано только одно изображение, и оно будет обязательным.
-
Является ли Stream лучшим способом передачи данных изображения между клиентом и сервером или мне следует использовать Byte []?
-
Для списка было бы разумно добавить новое свойство изображения в ProductInfo типа Stream (или Byte[]) или потребовать отдельного вызова службы для загрузки изображения?
-
Аналогично, для редактирования я просто обрабатываю данные изображения как любое другое свойство и передаю их туда и обратно по проводу, используя свойство изображения?
Ответ №1:
Является ли Stream лучшим способом передачи данных изображения между клиентом и сервером или мне следует использовать Byte []?
Это будет зависеть от используемой вами привязки, но с SOAP, даже если вы выберете Stream, в конечном итоге, когда сериализатору потребуется отправить его по сети, это будет массив байтов в кодировке base64.
Для списка было бы разумно добавить новое свойство изображения в ProductInfo типа Stream (или Byte[]) или потребовать отдельного вызова службы для загрузки изображения?
Я бы использовал отдельный вызов для загрузки каждого изображения с указанием идентификатора продукта. Таким образом, вы не будете загружать изображения каждый раз, когда захотите просмотреть информацию о продукте без предварительного просмотра, что может сэкономить пропускную способность.
Другая возможность — загрузить все изображения за один раз из службы WCF, а затем вызвать действие контроллера, которое загрузит их с помощью AJAX. Затем вставьте их в HTML как данные base64 (как это делает Google с предварительными просмотрами изображений на странице результатов)
Аналогично, для редактирования я просто обрабатываю данные изображения как любое другое свойство и передаю их туда и обратно по проводу, используя свойство изображения?
Для редактирования у вас может быть сервисный метод, который будет принимать массив байтов и идентификатор элемента, который вы обновляете.
Комментарии:
1. Я использую службу WCF REST, поэтому webHttpBinding, которая не использует SOAP.
2. Моя проблема с использованием отдельных методов обслуживания при редактировании продукта заключается в том, что у меня будет 1 вызов для получения сведений о продукте и еще один для получения изображения, отображения их пользователю, разрешения им вносить изменения, скажем, в описание продукта и изображение, затем отправлять изменения обратно в службу в одной операции для обновления описания и другой для обновления изображения. Это 4 вызова службы для 2 операций (получение и обновление). Действительно ли это лучший способ справиться с этим? Проще говоря, есть ли что-то неправильное во включении данных изображения с другими свойствами при получении и отправке продукта?
3. @SonOfPirate, если вы включите данные изображения как часть продукта (a
byte[]
), как вы собираетесь отображать их в HTML? В конце концов,<img>
ожидает, что егоsrc
свойство будет указывать либо на действие сервера, которое вернет данные изображения, либо на встроенную кодировку base64.4. Хороший вопрос. Мои первые мысли заключаются в том, что я бы вернул FileResult (используя метод File в классе Controller) из метода действия ProductImage. Но это означало бы, что мне пришлось бы сохранить исходный объект в сеансе или что-то еще для поддержки второго вызова для рендеринга изображения. Хммм…
Ответ №2:
Хотя я ценю ответ Дарина и изначально шел по этому пути, в итоге я выбрал тот же подход, описанный в Pro ASP.NET Платформа MVC 2.
В главе 6 описывается, как изображение может быть загружено как часть страницы редактирования объекта Product, а затем отображено с помощью действия контроллера на другой странице. Единственное отличие в моем приложении заключается в том, что сохранение обрабатывается на другом уровне через интерфейс веб-службы RESTful. Однако, основываясь на подходе, показанном в книге, я решил использовать единый DTO, который содержит свойства для двоичных данных изображения и информацию о строковом типе MIME.
Если бы у меня был другой пользовательский интерфейс или более тяжелый объект для передачи, я бы определенно пересмотрел этот подход, но на этот раз для меня это работает отлично.