tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
2
ZUGRIFFE
679
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Meldur Meldur ist offline Mitglied Gold
    Registriert seit
    Jan 2005
    Beiträge
    143
    Hallo,

    ich experimentiere gerade mit WCF herum und habe einen Service gebaut, der über BasicHttpBinding im transfereMode=Stremed Dateien beliebiger Größe übertragen soll. Solange ich nun Server und Client auf dem gleichen Rechner ausführe (nicht auf localhost, sondern der aktuellen Netzwerk-IP), schiebt er endlos viele Dateien hin und her. Wenn ich nun Server und Client auf jeweils einem Rechner habe, ist immer nach der 2. Datei (Download vom Server zum Client) Schluss. Der Server tut so, als hätte er die Anfrage gar nicht erhalten und der Client bricht irgendwann mit einem Timeout ab. Dabe scheint es keine Rolle zu spielen, wie groß die Dateien sind. Firewalls sind aus.

    Hat jemand eine Idee?

    Gruß,
    Meldur
     

  2. #2
    Avatar von sheel
    sheel sheel ist gerade online Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.504
    Zeig dienen Code.
     
    Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
    Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
    "Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?

  3. #3
    Meldur Meldur ist offline Mitglied Gold
    Registriert seit
    Jan 2005
    Beiträge
    143
    dann mal los...

    hier die bindings und der service-aufruf des servers

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    <bindings>
          <!--Dateitransfere-Service-->
          <basicHttpBinding>
            <binding name="FileTransferServicesBinding" transferMode="Streamed" messageEncoding="Mtom" maxReceivedMessageSize="10067108864">
              <security mode="None">
                
              </security>
            </binding>
          </basicHttpBinding>
        </bindings>

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
     <!--Dateitransfere-Service-->
          <service behaviorConfiguration="MyServiceTypeBehaviors" name="SC3Server.FileTransferService">
            <endpoint address="mex" binding="basicHttpBinding" bindingConfiguration="FileTransferServicesBinding" contract="SC3NetworkInterface.IFileTransferService"/>
            <host>
              <baseAddresses>
                <add baseAddress="http://2.0.0.2:8080/FileTranfer"/>
              </baseAddresses>
            </host>
          </service>

    beim Client konfiguriere ich den Dienst zur Laufzeit:

    Code :
    1
    2
    3
    4
    5
    6
    
    System.ServiceModel.Channels.Binding ftBinding = new BasicHttpBinding();
                    ((BasicHttpBinding)ftBinding).TransferMode = TransferMode.Streamed;
                    ((BasicHttpBinding)ftBinding).MessageEncoding = WSMessageEncoding.Mtom;
                    ((BasicHttpBinding)ftBinding).MaxReceivedMessageSize = 10067108864;
                    EndpointAddress ea2 = new EndpointAddress("http://" + this.config.ServerIP + ":" + this.config.ServerFileTransferePort + "/FileTranfer/mex");
                    ftClient = new FileTransferServiceClient(ftBinding, ea2);

    Die Klasse FileTransfereServiceClient ist meine Interface-Klasse und beinhaltet Up- und Downloadroutinen.

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    
     [ServiceContract]
        public interface IFileTransferService
        {
            [OperationContract]
            void UploadFile(RemoteFileInfo request);
     
            [OperationContract]
            RemoteFileInfo DownloadFile(DownloadRequest request);
        }
     
        [MessageContract]
        public class DownloadRequest
        {
            [MessageBodyMember]
            public string FileName;
        }
     
        [MessageContract]
        public class RemoteFileInfo: IDisposable
        {
            [MessageHeader(MustUnderstand = true)]
            public string FileName;
     
            [MessageHeader(MustUnderstand = true)]
            public long Length;
     
            [MessageBodyMember(Order = 1)]
            public System.IO.Stream FileByteStream;
     
            public void Dispose()
            {
                // close stream when the contract instance is disposed. this ensures that stream is closed when file download is complete, since download procedure is handled by the client and the stream must be closed on server.           
                if (FileByteStream!=null)
                {
                    FileByteStream.Close();
                    FileByteStream = null;
                }
            }
        }


    dann hier noch ein Downloadaufruf vom Client:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    
     System.IO.Stream inputStream;
                long fileLength = this.TransfereClient.DownloadFile(ref this.currentDownloadFile, out inputStream);
                long allReaded = 0;
     
                // write server stream to disk
                using (System.IO.FileStream writeStream = new System.IO.FileStream(filePath, System.IO.FileMode.CreateNew, System.IO.FileAccess.Write))
                {
                    int chunkSize = 2048;
                    byte[] buffer = new byte[chunkSize];
     
                    do
                    {
                        // read bytes from input stream
                        int bytesRead = inputStream.Read(buffer, 0, chunkSize);
                        allReaded += bytesRead;
                        if (bytesRead == 0) break;
     
                        // write bytes to output stream
                        writeStream.Write(buffer, 0, bytesRead);
                      
     
                       // report progress from time to time
                       Download_ProgressChanged(null, new StreamWithProgress.ProgressChangedEventArgs(allReaded, fileLength));
     
                    } while (true);
                
     
                    writeStream.Close();
                }


    und zu guter letzt die Antwort-Routine vom Server:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    
    public RemoteFileInfo DownloadFile(DownloadRequest request)
            {
                // get some info about the input file
                string filePath = this.serverFileRoot + request.FileName;
                System.IO.FileInfo fileInfo = new System.IO.FileInfo(filePath);
     
                // report start
                Console.WriteLine("Sending stream " + request.FileName + " to client");
                Console.WriteLine("Size " + fileInfo.Length);
     
                // check if exists
                if (!fileInfo.Exists) throw new System.IO.FileNotFoundException("File not found", request.FileName);
     
                // open stream
                System.IO.FileStream stream = new System.IO.FileStream(filePath, System.IO.FileMode.Open, System.IO.FileAccess.Read);
                this.activeDownloadStreams.Add(stream);
     
                // return result
                RemoteFileInfo result = new RemoteFileInfo();
                result.FileName = request.FileName;
                result.Length = fileInfo.Length;
                result.FileByteStream = stream;
                return result;
     
                // after returning to the client download starts. Stream remains open and on server and the client reads it, although the execution of this method is completed.
            }


    ab der dritten Datei springt er die Server-Seite nicht mehr an - zumindest wird kein Haltepunkt ausgelöst.
     

Ähnliche Themen

  1. Brauch Hilfe beim Umwandeln von vob-Dateien in Audio-Dateien
    Von campino2 im Forum Videoschnitt, Videotechnik & -produktion
    Antworten: 1
    Letzter Beitrag: 23.08.06, 03:13
  2. In Dateien schreiben und Dateien auslesen (z.B. User + Pwd)
    Von NeoHeadquarter im Forum Visual Basic 6.0
    Antworten: 1
    Letzter Beitrag: 09.05.06, 13:44
  3. Antworten: 4
    Letzter Beitrag: 28.03.05, 13:22
  4. Wie kann ich *.wma-Dateien in *.mp3 Dateien umwandlen ?
    Von canonshoot im Forum Audiotechnik, Recording & Audio-Software
    Antworten: 1
    Letzter Beitrag: 05.01.04, 01:09