Можно ли использовать службу данных WCF для возврата файла?
Я хочу использовать службу данных WCF для возврата mp3-файлов, а также других типов данных, уже обслуживаемых WCF. Возможно ли это?
[12/29] у меня есть двоичные данные mp3 в sql (~10 секунд каждый). Я хотел бы использовать html аудио тег с ним:
<audio src="/server/svc/id" type="audio/mpeg" />
Javascript изменит идентификатор. Не уверен, как это будет работать с WCF, возвращающим двоичный массив...
[12/30] это работает.... после установки mimetype в CSDL.
1 ответ:
Конечно, вы можете сделать это тремя возможными способами:
Включите его в качестве бинарного свойства в существующую сущность (обычно служба размещает сущности, представляющие каждый аудиофайл в этом случае, который будет иметь одно из своих свойств, являющееся фактическим Аудио mp3). В коде это просто объявить свойство типа byte [] (и заполнить его). Плюс в том, что это действительно легко настроить. Недостатком является то, что когда вы получаете такую сущность, весь mp3 загружается и передается как кодированный текст BASE64, так он большой на проводе.
Аналогичная настройка, как и выше, но вместо хранения mp3 в двоичном свойстве вы делаете сущность записью медиаресурса, вы делаете ее значение потока по умолчанию. Это описано в этом блоге более подробно: http://blogs.msdn.com/b/astoriateam/archive/2010/08/04/data-services-streaming-provider-series-implementing-a-streaming-provider-part-1.aspx и http://blogs.msdn.com/b/astoriateam/archive/2010/09/08/data-services-streaming-provider-series-part-2-accessing-a-media-resource-stream-from-the-client.aspx.
В последней версии CTP WCF DS также поддерживает свойства потока. Это похоже на #2 выше, но одна сущность может иметь несколько потоков, каждый из которых доступен по своему имени.
Для доступа к исходному значению аудиопотока можно использовать URL-адрес (зависит от метода, используемого для предоставления поток):
Urltotheentity/MyBinaryProperty/$value
Urltotheentity/ $ value
Urltotheentity/StreamPropertyName/$value
Обратите внимание, что в #1 тип MIME потока по умолчанию будет application/octet-stream, чтобы изменить его, вам нужно добавить атрибут MimeType для свойства (поставщик отражения) или атрибут в CSDL для этого свойства (поставщик EF). В #2 и #3 тип mime определяется через вызов потока поставщик.