Приложение Silverlight, запрашивающее файл у службы WCF - PullRequest
1 голос
/ 01 октября 2009

У меня есть приложение Silverlight (v3), которое взаимодействует со службой WCF на моем сервере. Приложение Silverlight выполняет запрос динамически генерируемого файла данных - этот файл данных создается службой и должен (в конечном итоге) быть сохранен на локальном компьютере пользователя с помощью SaveFileDialog.

Мой вопрос: как лучше всего получить в Silverlight этот файл? Файл, о котором идет речь, может быть довольно большим.

Любая помощь будет оценена.

1 Ответ

1 голос
/ 01 октября 2009

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

Таким образом, у вас будет обычная конечная точка (например, http://yourserver:8080/YourService), которую вы используете для «обычных» вызовов методов), и вторая конечная точка (http://yourserver:8085/YourService), которая будет поддерживать потоковую передачу для отправки файла с разумные объемы памяти.

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

<system.serviceModel>
  <bindings>
    <basicHttpBinding>
      <binding name="streamed"
               transferMode="StreamedResponse" />
    </basicHttpBinding>
  </bindings>
  <services>
    <service name="YourService">
      <endpoint name="normal" 
                address="http://yourserver:8080/YourService"
                binding="basicHttpBinding"
                contract="IYourServiceContract" />
      <endpoint name="filetransfer" 
                address="http://yourserver:8085/YourService"
                binding="basicHttpBinding"
                bindingConfiguration="streamed"
                contract="IYourServiceContract" />
    </service>
  </services>
</system.serviceModel>

На клиенте, конечно, вы должны иметь две конечные точки внутри тега <client>, но в остальном все должно быть одинаково.

«TransferMode» по умолчанию «буферизован», например, все сообщение буферизуется и отправляется в одном блоке.

Другими вариантами являются «Потоковый» (потоковая передача в обе стороны), «StreamedRequest» (если у вас действительно большие запросы) или «StreamedResponse» (если только ответ, передаваемый файл действительно большой).

В этом случае в вашей службе будет один метод, который будет возвращать stream (т.е. файл). От вашего клиента, когда вы вызываете этот сервисный метод, вы получаете поток, который затем можете читать в блоках, как MemoryStream или FileStream.

Марк

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...