Необходимо передать содержимое большого файла из службы wcf в клиент Java (веб-приложение Java)

в основном нужно передать большой файл между службой wcf и клиентом java, может кто-нибудь дать направление, пожалуйста?

В основном мне нужно создать службу wcf, которая должна читать содержимое blob (фактически содержимое файла, хранящееся в столбце db) и передать его в веб-приложение java < / strong> (являясь клиентом wcf).

Размер файла может варьироваться от 1 КБ до 20 МБ. К настоящему времени я уже изучил / проверил нижеперечисленные варианты, но все еще не могу окончательно определить, какой из них мне следует выбрать, что возможно, а что нет. Может кто-нибудь посоветует мне, пожалуйста.

  1. передать содержимое файла как byte []: я понимаю, что это увеличит размер данных, передаваемых клиенту, поскольку он будет кодировать данные в формате base 64 и встраивать кодировку base 64 в само сообщение мыла, что замедляет обмен данными и есть проблемы с производительностью. Но это точно работает, но я не уверен, целесообразно ли использовать этот подход.

  2. Совместное использование NetworkDrive / FTPFolder, доступного как для клиента, так и для приложения службы wcf: для этого файл, необходимый клиенту, сначала сохраняется там с помощью wcf, а затем клиенту необходимо использовать параметры ввода-вывода java ИЛИ FTP для его чтения . Это выглядит хорошо с точки зрения размера данных / пропускной способности, но имеет дополнительную обработку как на стороне службы, так и на стороне клиента (при необходимости хранить / читать через папку NetworkShared / FTP)

  3. Потоковая передача: я не уверен, что она будет осуществима с клиентом Java, но я понимаю, что потоковая передача поддерживается для клиентов не .net, но как это сделать, я не уверен ??? Я понимаю, что для потоковой передачи мне нужно использовать привязку basichttp, но мне нужно использовать DataContract или MessageContract, или что-то еще будет работать, а затем что должно быть сделано на стороне клиента java, в чем я не уверен.
  4. Использование подхода MTOM для передачи больших данных в запросах мыла. Похоже, что на самом деле у него есть поддержка, специально разработанная для решения передачи больших объемов данных в вызовах веб-служб, но мне нужно продолжить изучение этого вопроса, на данный момент я не есть много идей по этому поводу. Есть ли у кого-нибудь из вас предложения по этому поводу?

Я понимаю, что вопрос немного длиннее, но мне пришлось указать все 4 варианта, которые я пробовал, и мои проблемы / выводы по каждому из них, чтобы вы все могли предложить среди них или новый вариант, также вы будете знать то, что я уже пробовал, может направить меня более эффективно.


person LearningNeverEnds    schedule 06.09.2013    source источник


Ответы (1)


Я нахожусь в том же положении, что и вы, и по опыту могу сказать, что вариант 1 - плохой выбор для всего, что превышает пару МБ.

В моей собственной системе время загрузки увеличивается в геометрической прогрессии, при этом загрузка файлов размером 25 МБ занимает более 30 минут.

Я использовал некоторые тайминги, и большая часть этого связана с передачей файла из клиента .NET в веб-службу Java. Наш веб-сервис - это фасад для набора сторонних сервисов; использование встроенного клиента, предоставленного сторонней организацией (нецелесообразно в бизнес-контексте), выполняется значительно быстрее - менее 5 минут для файла размером 25 МБ. Загрузка в наше клиентское приложение также выполняется быстро.

Мы пробовали MTOM и, если не реализовали его неправильно, не увидели значительных улучшений (прирост скорости менее 10%).

Следующим портом захода будет вариант 2 - передача файлов выполняется относительно быстро, поэтому, загружая файл непосредственно на один из хостов веб-служб, я надеюсь, что это значительно ускорит процесс - если я получу какие-то значимые результаты, я добавлю их в свой Почта.

person SketchyDev    schedule 23.09.2013
comment
Я рад, что кто-то внес свой вклад, спасибо. кстати, есть ли у вас какой-либо ввод / опыт по варианту 3 с файлом потока wcf (большие данные) для веб-клиента java? Я имею в виду, что из моих исследований / чтений я понимаю, что с помощью basichttpbinding возможно выполнение потоковой передачи для клиента веб-службы, но я просто не знаю, что нужно закодировать / сделать на стороне клиента java, как настроить. полностью отсутствуют указания по этому поводу, когда дело доходит до веб-клиента Java. любой ввод? - person LearningNeverEnds; 23.09.2013
comment
Я еще не очень много изучал вариант 3, но я понимаю, что это возможно. Если 2 не подходит, то мы рассмотрим 3 - извините, я больше ничем не могу помочь с этим. - person SketchyDev; 23.09.2013
comment
@ SketchyBFC: я надеялся выбрать вариант 2, но поскольку клиенты моего приложения будут работать из безопасного региона, где из-за политик организации мы не можем разрешить для них общий сетевой диск или ftp, поэтому вариант 2 был отклонен для меня. в настоящее время я работаю над другими вещами, но скоро попробую вариант 3. Дам вам знать, если все получится. - person LearningNeverEnds; 24.09.2013