Frage

In WCF, Verträge können auf Streaming-Modus umgeschaltet werden, um große Nachrichten zu übertragen.

Nach der Lektüre und Prüfung scheint es mir, kann man erkennen, Streaming-Modus nicht mit Duplexkanäle (Kanäle mit OneWay-Anrufe und eine Callback-Schnittstelle) verwendet werden.

Ist das so? Beidseitig bedrucken und Streaming können nicht miteinander verwendet werden? Oder gibt es eine Möglichkeit?

(Ich versuche, eine große Datei auf den Dienst zum Hochladen und Rückruf verwendet Fortschritt auf diesem Bericht)

War es hilfreich?

Lösung

Sie die Datei vom Client zum Server zu laden, können Sie den folgenden Code verwenden: 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();
            }
        }}

Client:

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>

ist immer besser, eine Reihe von Bytes zu übergeben. Ich denke, nicht brauchen, um die Callback-Funktionen beschreiben?

Andere Tipps

Aus Neugier war ich über einige Tests auf Ihre Frage zu beginnen, aber dann ergab Google die beiden Proben zu mir, die Ihre Frage besser beantworten können.

Dieses Beispiel Codeproject zeigt Streaming-Dateiübertragungen mit einer Statusleiste ohne Duplex-Kanäle.

Diese Probe zeigt mehr von der gleichen aber mit einigen anderen Verfügen des Stroms.

Auch eine wirklich gute Ressource für alle Dinge im Zusammenhang WCF ist iDesgin.net . Der Hauptmann gibt es Juval Löwy, der einige der besten Bücher über WCF geschrieben. Sie haben viele hervorragende WCF Beispiele, die Sie herunterladen können (obwohl sie annoyingly Ihr für jeden für Ihre E-Mail-Adresse fragen). tun können, vor allem in Bezug auf die Duplex-Kanäle Noch wichtiger ist, schrieb sie auch eine ServiceProcessEx Klasse, die stark, was ServiceProcess erstreckt. (Ich bin nicht sicher, ob es viel beschäftigt sich mit Streaming obwohl ... es ist nicht etwas, was ich schon getan habe).

Ich hoffe, einige dieser ist hilfreich für Sie.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top