从WCF下载许多文件的问题

时间:2010-10-14 08:52:09

标签: wcf .net-3.5 streaming

我遇到WCF服务问题。当我下载2个文件时,一切正常(不到1分钟),但是当我尝试下载超过3个文件时,会发生一些不好的事情。我正在等待,等待什么都没有:/每个文件大约有1 MB。

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;
     }

 }

WCF服务的方法:

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

        }

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>

2 个答案:

答案 0 :(得分:3)

您不应该关闭服务端的流。

您将如何做:

  1. 在服务上打开流
  2. 将流返回客户端
  3. 在客户端上阅读流
  4. 关闭客户端上的流
  5. WCF将负责为您关闭服务流

答案 1 :(得分:1)

不是返回流,而是将流读入字节数组,然后返回字节数组。