Загрузка файла с использованием службы WCF не работает, когда TransferMode = "Потоковый" - PullRequest
0 голосов
/ 07 октября 2009

Подробности конфигурации следующие:

Web.config службы Wcf, которая размещена.

<basicHttpBinding>
    <binding name="HttpBinding_MTOM" messageEncoding="Mtom" 
             transferMode="Streamed" maxBufferSize="65536" 
             maxReceivedMessageSize="534773760">
      <security mode="None">
        <transport clientCredentialType="None" />
      </security>
    </binding>
</basicHttpBinding>
<services>
   <service name="OA.Smart.Services.FileTransferService"
            behaviorConfiguration="FileTransferServiceBehavior">
      <endpoint address="" 
                binding="basicHttpBinding" 
                bindingConfiguration="HttpBinding_MTOM"
                contract="OA.Smart.ServiceContract.IFileTransferService">
         <identity>
            <dns value="localhost" />
         </identity>
      </endpoint>
      <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
   </service>      
</services>
<behavior name="FileTransferServiceBehavior">
   <serviceMetadata httpGetEnabled="true" />
   <serviceDebug includeExceptionDetailInFaults="false" />
</behavior>

У меня есть интеллектуальное клиентское приложение, которое обращается к этой службе WCF. App.Config выглядит следующим образом

<bindings>
  <basicHttpBinding>
 <binding name="BasicHttpBinding_IFileTransferService" 
              closeTimeout="00:30:00" openTimeout="00:30: 
              receiveTimeout="00:30:00" sendTimeout="00:30:00"
      allowCookies="false" bypassProxyOnLocal="false" 
              hostNameComparisonMode="StrongWildcard"
      maxBufferSize="65536" maxBufferPoolSize="524288" 
              maxReceivedMessageSize="65536"
      messageEncoding="Mtom" textEncoding="utf-8" 
              transferMode="Streamed" useDefaultWebProxy="true">
     <readerQuotas 
              maxDepth="32" maxStringContentLength="8192" 
              maxArrayLength="16384" maxBytesPerRead="4096" 
              maxNameTableCharCount="16384" />
         <security mode="None">
             <transport clientCredentialType="None" proxyCredentialType="None"
                        realm="" />
             <message clientCredentialType="UserName" algorithmSuite="Default" />
         </security>
      </binding>
   </basicHttpBinding>
</bindings>
<client>
    <endpoint 
       address="http://localhost:4149/OA.Smart.ServiceHost/FileTransferService.svc"
       behaviorConfiguration="defaultServiceBehaviour"
       binding="basicHttpBinding"  
       bindingConfiguration="BasicHttpBinding_IFileTransferService"
       contract="FileTransferServiceReference.IFileTransferService"
       name="BasicHttpBinding_IFileTransferService">
    </endpoint>
</client>
<behaviors>
   <endpointBehaviors>
       <behavior name="defaultServiceBehaviour">
           <dataContractSerializer maxItemsInObjectGraph="2147483646" />
       </behavior>
   </endpointBehaviors>
</behaviors>

С этой конфигурацией, когда я пытаюсь загрузить свой файл, она выдает ошибку

System.Net.WebException: The remote server returned an error: (400) Bad Request.
   at System.Net.HttpWebRequest.GetResponse() 
   at System.ServiceModel.Channels.HttpChannelFactory.
        HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout)}

Однако, если я изменяю TransferMode = "Streamed" на "Buffered", он работает как положено. Я не понимаю, почему так себя ведет. TransferMode службы WCF является потоковым, поэтому он должен работать с потоковым.

Подскажите, пожалуйста, как заставить его работать с помощью TransferMode = "Streamed"

Ответы [ 2 ]

2 голосов
/ 07 октября 2009

Проблема заключалась в размещении служб WCF. Я разместил их на Cassini (веб-сервере, который поставляется с VS2008) вместо IIS. Cassini не разрешает потоковую передачу по HTTP. Так что только использование IIS для размещения служб WCF решило эту проблему.

0 голосов
/ 07 октября 2009

Вы хотите загружать файлы только на сервер? В этом случае вы пытались использовать

transferMode="StreamedRequest"

вместо "Потоковой" ?? Какая разница?

Кроме того, вы можете показать нам контракт на обслуживание (интерфейс, против которого вы программируете)? Это также может дать нам подсказку.

Марк

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...