WCF: можно ли использовать потоковый режим в дуплексном канале?

В WCF контракты можно переключить в потоковый режим для передачи больших сообщений.

После прочтения и тестирования мне кажется, что потоковый режим нельзя использовать с дуплексными каналами (каналы с OneWay-звонками и интерфейсом обратного вызова).

Это так? Разве дуплекс и стриминг нельзя использовать друг с другом? Или есть способ?

(Я пытаюсь загрузить в службу большой файл и использовать обратный вызов, чтобы сообщить об этом)


person Sam    schedule 07.01.2009    source источник


Ответы (2)


чтобы загрузить файл с клиента на сервер, вы можете использовать следующий код: service

 [ServiceContract(SessionMode=SessionMode.Required, CallbackContract=typeof(IFreeBoxServiceCallBack))]
    public interface IFreeBoxService
    {
        [OperationContract(IsOneWay = true)]
        void sendFile(byte[] bytes, int offset, int count);

        [OperationContract(IsOneWay = true)]
        void sendFileName(string fileName);
    }

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode=ConcurrencyMode.Multiple)]
    public class FreeBoxService:IFreeBoxService
    {
        string path = "D:\\repository\\";
        string fileName = "";
        IFreeBoxServiceCallBack callBack = null;

        public FreeBoxService()
        {
            callBack = OperationContext.Current.GetCallbackChannel<IFreeBoxServiceCallBack>();
        }

        public void sendFileName(string fileName)
        {
            this.fileName = fileName;
        }

        public void sendFile(byte[] bytes, int offset, int count)
        {
            using (FileStream fileStream = new FileStream(path + fileName, FileMode.Append, FileAccess.Write))
            {
                fileStream.Write(bytes, offset, count);
                fileStream.Close();
                fileStream.Dispose();
            }
        }}

клиент:

private void sendFileToServer()
        {
            FileStream fs = new FileStream(fullName,FileMode.Open,FileAccess.Read);
            int bytesRead = 0;
            bytes = new byte[15000];

            proxy.sendFileName("someFile.xml");

            while ((bytesRead = fs.Read(bytes, 0, 15000))>0)
            {
                proxy.sendFile(bytes, 0, bytesRead);
            }
            fs.Close();
            fs.Dispose();
        }

.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <services>
      <service name="FreeBoxServiceLib.FreeBoxService" behaviorConfiguration="MyServiceBehevior">
        <endpoint address="" contract="FreeBoxServiceLib.IFreeBoxService"
                  binding="netTcpBinding">
        </endpoint>
        <endpoint address="MEX" binding="mexTcpBinding" contract="IMetadataExchange"/>
        <host>
          <baseAddresses>
            <add baseAddress="net.tcp://localhost:8080/FreeBoxService/"/>
          </baseAddresses>
        </host>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="MyServiceBehevior">
          <serviceMetadata />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

всегда лучше передавать массив байтов. Думаю, не нужно описывать callback-функции?

person Roman Ostashevskyi    schedule 23.11.2013

Из любопытства я собирался начать тестирование по вашему вопросу, но затем Google показал мне два образца, которые могли бы лучше ответить на ваш вопрос.

В этом примере CodeProject показаны потоковые передачи файлов с индикатором выполнения без использования дуплексных каналов.

Этот образец показывает больше того же, но с некоторыми различное расположение потока.

Кроме того, действительно хорошим ресурсом по всем вопросам, связанным с WCF, является iDesgin.net. Главный герой - Джуваль Лоуи, написавший одни из лучших книг о WCF. У них есть десятки отличных примеров WCF, которые вы можете скачать (хотя они досадно спрашивают ваш адрес электронной почты для каждого из них). Что еще более важно, они также написали класс ServiceProcessEx, который значительно расширяет возможности ServiceProcess, особенно в отношении дуплексных каналов. (Я не уверен, что он имеет дело с потоковой передачей, хотя ... это еще не то, что я сделал).

Надеюсь, что-то из этого будет вам полезно.

person Sailing Judo    schedule 17.01.2009
comment
Первая (CodeProject) не имеет ссылки на дуплексную привязку. Две вторые ссылки не работают. - person Robert MacLean; 19.04.2012