2013-03-14 60 views
2

我正在制作WCF服务来传输文件。我只有基本的WCF理解,并遵循MSDN教程:WCF Tutorial 我开始使用字节数组来传输文件,但只要文件有一点点大(100kb就足够了),它会因错误的请求而失败。 我遵循另一个指南,并改为使用消息流式传输,它也适用于小文件,但与较旧的版本一样会失败。我怀疑这个错误在我的配置文件中,因为svcutil.exe生成的配置文件没有提供关于流式处理的任何信息。 这是我的客户的app.config:WCF Streaming无法传输大文件

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
<system.serviceModel> 
    <bindings> 
     <wsHttpBinding> 
      <binding name="WSHttpBinding_IDocPublisher" closeTimeout="00:01:00" 
       openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" 
       bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" 
       maxBufferPoolSize="200000000" maxReceivedMessageSize="200000000" 
       messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" 
       allowCookies="false"> 
       <readerQuotas maxDepth="200000000" maxStringContentLength="200000000" maxArrayLength="200000000" 
        maxBytesPerRead="200000000" maxNameTableCharCount="200000000" /> 
       <reliableSession ordered="true" inactivityTimeout="00:10:00" 
        enabled="false" /> 
       <security mode="Message"> 
        <transport clientCredentialType="Windows" proxyCredentialType="None" 
         realm="" /> 
        <message clientCredentialType="Windows" negotiateServiceCredential="true" 
         algorithmSuite="Default" /> 
       </security> 
      </binding> 
     </wsHttpBinding> 
    </bindings> 
    <client> 
     <endpoint address="http://localhost:8000/ServiceModelSamples/docPublisherWebService/docPublisher" 
      binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IDocPublisher" 
      contract="IDocPublisher" name="WSHttpBinding_IDocPublisher"> 
      <identity> 
       <userPrincipalName value="Emil-PC\Emil" /> 
      </identity> 
     </endpoint> 
    </client> 
</system.serviceModel> 
</configuration> 

这是服务器的app.config

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
<system.serviceModel> 
<behaviors> 
    <serviceBehaviors> 
    <behavior name="serviceBehavior"> 
     <serviceMetadata httpGetEnabled="true"/> 
     <serviceDebug includeExceptionDetailInFaults="true" 
          httpHelpPageEnabled="true" /> 
     <dataContractSerializer maxItemsInObjectGraph="2147483647"/> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 
<services> 
    <service behaviorConfiguration="serviceBehavior" 
       name="DocPublisher"> 
    <endpoint address="http://localhost:8000/ServiceModelSamples/docPublisherWebService" 
       name="basicHttpStream" 
       binding="basicHttpBinding" 
       bindingConfiguration="httpLargeMessageStream" 
       contract="IDocPublisher" /> 
    <endpoint address="mex" 
        binding="mexHttpBinding" 
        contract="IMetadataExchange"/> 
    </service> 
</services> 
<bindings> 
    <basicHttpBinding> 
    <binding name="httpLargeMessageStream" 
       maxReceivedMessageSize="200000000" 
       maxBufferSize="200000000" 
       transferMode="Streamed" 
       messageEncoding="Mtom" /> 
    </basicHttpBinding> 
</bindings> 
</system.serviceModel> 
</configuration> 

回答

1

试图增加在客户端发送超时和读者的配额,在服务器端设置缓冲区的大小。

+0

我无法在服务器上设置bufferSize,只是maxBufferSize。我尝试了你所建议的改变,但他们没有奏效。我已经用新值更新了我的代码。 – 2013-03-14 15:23:23

1

原来的配置文件不是真正的问题,问题是服务器app.config从来没有使用过,因为msdn教程不使用app.config,而是在主要方法中创建端点。

+0

你能否详细说一下Emil?如何更改即时创建的端点? – DevDave 2013-05-24 14:57:30