2010-10-14 7 views
0

J'ai un problème avec le service WCF. Quand je télécharge 2 fichiers tout fonctionne bien (moins de 1 minute), mais quand j'essaye de télécharger plus de 3 fichiers, il y a quelque chose qui va mal. J'attends et j'attends et rien:/Chaque fichier a environ 1 Mo.Problème avec le téléchargement de nombreux fichiers de WCF

Dictionary<FileIdentifier, Stream> data = new Dictionary<FileIdentifier, Stream>(); 

foreach (string path in paths) 
{ 

    using (var client = new ServiceClient()) 
    { 
     var stream = client.GetFile(path); 

     data[fileIdentifier] = stream; 
    } 

} 

Méthode au service WCF:

public Stream GetFile(string path) 
     { 
      FileStream fs = new FileStream(stream, FileMode.Open); 
      fs.Close(); 
      return fs; 

     } 

config de service WCF:

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 

    <system.serviceModel> 
    <client /> 
    <bindings> 
     <basicHttpBinding> 
     <binding name="basicHttpBindingConfiguration" closeTimeout="00:10:00" 
      openTimeout="00:15:00" receiveTimeout="00:15:00" sendTimeout="00:15:00" 
      allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" 
      maxBufferSize="2097152000" maxBufferPoolSize="524288000" maxReceivedMessageSize="2097152000" 
      messageEncoding="Text" textEncoding="utf-8" transferMode="Streamed" 
      useDefaultWebProxy="true"> 
      <readerQuotas maxDepth="32" maxStringContentLength="524288000" 
      maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
      <security mode="None"> 
      <transport clientCredentialType="None" proxyCredentialType="None" 
       realm="" /> 
      <message clientCredentialType="UserName" algorithmSuite="Default" /> 
      </security> 
     </binding> 
     </basicHttpBinding> 
    </bindings> 
    <services> 
     <service name="FileServer.Service" behaviorConfiguration="FileServer.Service1Behavior"> 
     <host> 
      <baseAddresses> 
      <add baseAddress="http://localhost:8731/Design_Time_Addresses/Server.FileServer/Service/" /> 
      </baseAddresses> 
     </host> 
     <!-- Service Endpoints --> 
     <!-- Unless fully qualified, address is relative to base address supplied above --> 
     <endpoint address="" contract="FileServer.IService" binding="basicHttpBinding" bindingConfiguration="basicHttpBindingConfiguration"> 
      <!-- 
       Upon deployment, the following identity element should be removed or replaced to reflect the 
       identity under which the deployed service runs. If removed, WCF will infer an appropriate identity 
       automatically. 
      --> 
      <identity> 
      <dns value="localhost" /> 
      </identity> 
     </endpoint> 
     <!-- Metadata Endpoints --> 
     <!-- The Metadata Exchange endpoint is used by the service to describe itself to clients. --> 
     <!-- This endpoint does not use a secure binding and should be secured or removed before deployment --> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="FileServer.Service1Behavior"> 
      <!-- To avoid disclosing metadata information, 
      set the value below to false and remove the metadata endpoint above before deployment --> 
      <serviceMetadata httpGetEnabled="True" /> 
      <!-- To receive exception details in faults for debugging purposes, 
      set the value below to true. Set to false before deployment 
      to avoid disclosing exception information --> 
      <serviceDebug includeExceptionDetailInFaults="true" /> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    </system.serviceModel> 
    <system.web> 
    <compilation debug="true" /> 
    <httpRuntime maxRequestLength="2097151" executionTimeout="1000" /> 
    <customErrors mode="RemoteOnly" /> 
    </system.web> 
    <system.webServer> 
    <directoryBrowse enabled="false" /> 
    </system.webServer> 
</configuration> 
+0

IIRC, c'est une limite ion de la spécification HTTP. Vous ne pouvez pas faire grand-chose à ce sujet (pour autant que je sache). Pourquoi téléchargez-vous des fichiers via WCF? Sûrement les frais généraux de bande passante seront «massifs». – leppie

+0

J'utilise ce serveur même pour télécharger des fichiers qui a 2 Go de taille, donc je ne sais pas si c'est un vrai problème avec la limitation de la spécification HTTP:/Mais je suis très novice:/ – user278618

+1

@ user278618: Désolé, je devrais mentionner la limitation est pour les connexions simultanées au même serveur. Ceci est bloqué à 2. – leppie

Répondre

3

Vous ne devez pas fermer le flux côté service.

Voici comment vous faire:

  1. flux ouvert sur le service
  2. flux de retour au client
  3. Lire le flux sur le client
  4. Fermez le flux sur le client
  5. WCF prendra soin de fermer le flux de service pour vous
+0

+1 Je ne sais pas pourquoi il semble fonctionner pour 1 ou 2 fichiers, mais oui, vous ne devez pas fermer le flux côté serveur. –

1

au lieu de retourner un ruisseau, lire le flux dans un tableau d'octets, puis retourne le tableau d'octets .

+0

Cela signifierait que les données seraient tamponnées et la taille du message potentiellement énorme (à 1MB par fichier). Le streaming est la bonne façon de procéder (voir la réponse de @ Johann). –

Questions connexes