#c# #wcf
#c# #wcf
Вопрос:
Я работаю над проектом медиа-сервера для школы, и я выбрал подход WCF для этого. Однако я начинаю задаваться вопросом, хорошая ли это идея.
Является ли получение службы WCF для загрузки файлов простым делом? Под простым я подразумеваю то, что не требует большого количества взломов или сторонних библиотек. Ожидается, что служба WCF также будет передавать как аудио, так и видео своим потребителям / клиентам.
Я должен также упомянуть, что рассматриваемая служба WCF размещается как служба, управляемая Windows, за пределами IIS.
Это своего рода то, что я имею в виду прямо сейчас:
[OperationContract]
bool AddFile(byte[] filedata);
[OperationContract]
bool DeleteFile(int fileid);
[OperationContract]
byte[] GetFile(int fileid);
Комментарии:
1. Как: Включить потоковую передачу :: msdn.microsoft.com/en-us/library/ms789010.aspx
2. @Mitch : Я собираюсь разобраться с потоковой передачей позже. На данный момент я был бы признателен за любые советы по загрузке. Я нашел пару сайтов с решениями для этого, но большинство из них имеют какие-то ограничения в своем подходе. Один из подходов, например, будет работать только в том случае, если служба WCF была запущена как консольное приложение вне IIS или Windows Service Management.
Ответ №1:
Определите методы для получения и возврата Stream
типа данных и убедитесь, что настроили вашу привязку на использование TransferMode.Streamed
. Также убедитесь, что вы знаете кодировку, которую используете в своей привязке. Если вы используете Text
, все двоичные данные будут закодированы в base64, что увеличит размер всех ваших запросов / ответов. Если вы используете MTOM, то большие двоичные данные, такие как потоки, будут передаваться за пределы тела SOAP как отдельный объект тела HTTP в виде чистых, некодированных двоичных данных. Очевидно, что двоичное кодирование обеспечит наиболее оптимальную передачу по проводам, однако это не стандартный формат, поэтому взаимодействие с другими стеками, отличными от WCF, будет невозможно. Однако, если вы используете чистый WCF, вы не сможете превзойти производительность двоичного кодирования сообщений, поэтому я настоятельно рекомендую его или возвращаюсь к MTOM, если вам требуется взаимодействие.
Кроме того, я до сих пор предполагал, что вы пытаетесь сделать это в рамках SOAP. Если вы используете REST, тогда XML по сравнению с MTOM по сравнению Двоичное кодирование было бы облегчено, потому что вы могли бы просто отправлять / получать чистое двоичное тело HTTP с соответствующим типом содержимого. Все зависит от того, что вы пытаетесь сделать
Комментарии:
1. На данный момент мне просто нужна служба WCF, чтобы иметь возможность обрабатывать простые передачи файлов. Кроме того, я не очень много знаю о REST. Должен ли я использовать это вместо SOAP?
2. Что классифицируется как «простое»? Вы говорите о файлах размером менее 1 МБ? Смысл использования потока в потоковом режиме заключается в том, что, если вы этого не сделаете, весь запрос / ответ должен быть помещен в буфер памяти перед отправкой / возвратом из службы yoru WCF. Очевидно, что если ваши сообщения будут большого размера, это не будет хорошо масштабироваться. Что касается SOAP и REST, я не буду здесь вдаваться в подробности, но я настоятельно рекомендую немного почитать о REST, чтобы понять, подходит ли он для того, что вы пытаетесь создать с помощью этого сервиса.
3. Спасибо, я изучу это. Немного о потоках также имеет гораздо больше смысла теперь. Итак, материал, описанный в той статье, на которую ссылается Митч Уит, — это то, что я должен делать для этого, верно? msdn.microsoft.com/en-us/library/ms789010.aspx
4. Просто для справки, WCF удаляет поток после завершения работы с ним, поэтому вам не нужно беспокоиться о том, что поток останется зависшим. (Вы можете проверить, унаследовав FileStream и переопределив метод Dispose).