Служба WCF загружает большой файл на ftp-сервер

Я разрабатываю одно приложение для Windows Phone, которое загружает zip-файл изображений на ftp-сервер. Но я не могу его загрузить. Выдает ошибку Удаленный сервер не найден.

Вот мое приложение WCF web.config

<?xml version="1.0"?>
<configuration>

 <appSettings>
       <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
</appSettings>
<system.web>
<compilation debug="true" targetFramework="4.5" />
<httpRuntime targetFramework="4.5" maxRequestLength="409600" />   
</system.web>
<system.serviceModel>
<bindings>
  <basicHttpBinding>
    <!--<binding maxReceivedMessageSize="2147483647" maxBufferPoolSize="2147483647" receiveTimeout="00:10:00" closeTimeout="00:10:00">
      <security mode="None" />
    </binding>-->
    <binding closeTimeout="01:30:00" 
      openTimeout="01:30:00" receiveTimeout="01:30:00" sendTimeout="01:30:00" 
      maxBufferSize="2147483646" maxBufferPoolSize="2147483646" maxReceivedMessageSize="2147483646">
      <readerQuotas maxDepth="2147483646" maxStringContentLength="2147483646" maxArrayLength="2147483646"
        maxBytesPerRead="2147483646" maxNameTableCharCount="2147483646" /> 
      <security mode="None">             
      </security>
    </binding>    
  </basicHttpBinding>    
</bindings>   

<behaviors>
  <serviceBehaviors>
    <behavior>
      <!-- To avoid disclosing metadata information, set the values below to false before deployment -->
      <serviceMetadata httpGetEnabled="true" httpsGetEnabled="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>
 <protocolMapping>
    <add binding="basicHttpsBinding"  scheme="https"/>
 </protocolMapping>    
 <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
 </system.serviceModel>
 <system.webServer>
  <modules runAllManagedModulesForAllRequests="true"/>
  <!--
    To browse web app root directory during debugging, set the value below to true.
    Set to false before deployment to avoid disclosing web app folder information.
  -->
 <directoryBrowse enabled="true"/>
</system.webServer>

Here is my ServiceReferences.ClientConfig

<configuration>
<system.serviceModel>
    <bindings>
        <basicHttpBinding>
            <binding name="BasicHttpBinding_IService1" maxBufferSize="2147483647" closeTimeout="01:10:00"
                    openTimeout="01:10:00" receiveTimeout="01:10:00" sendTimeout="01:10:00" maxReceivedMessageSize="2147483647">
                <security mode="None" />
            </binding>
        </basicHttpBinding>
    </bindings>
    <client>
        <endpoint address="http://xxx.xx.x.xxx/WebService/Service1.svc"
            binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IService1"
            contract="MyService.IService1" name="BasicHttpBinding_IService1" />
    </client>
</system.serviceModel>

I have create two project one is windows phone application, second is wcf application. I am sending large byte[] array to wcf server which gives an error Remote server Notfound. It works perfectly when the byte[] size is small but fails when the size is large. I heard that we can send very large file to wcf service near about 4gb. Then where I was wrong? Is there any change I have to do in web.config? I have hosted my wcf service to IIS on local machine.


person Ajay    schedule 25.09.2013    source источник


Ответы (1)


Для отправки больших данных через wcf у вас есть два варианта:

  1. Вы можете вручную разбить свои данные на части (или, например, прочитать по 2 КБ из файла) и передать каждую часть отдельно. На стороне сервера вы можете сохранить каждую часть во временном файле. Этот метод требует некоторого кодирования (например, контроль порядка порций).

  2. Другой вариант - использовать transferMode = "Streamed", но у этого режима есть некоторые ограничения.

Обновить

Если по каким-то причинам вы не можете использовать потоковый режим, вы можете создать в своем сервисе несколько методов:

string BeginSendFile();

Этот метод должен создать идентификатор (например, Guid) и вернуть его клиенту. Также сервис может создать файл во временном хранилище с этим именем.

void SendFilePortion(string id, byte[] data);

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

void EndSentFile(string id, string originalName);

Вызовите этот метод при передаче всех данных, чтобы переименовать временный файл и заменить его в нестандартном хранилище.

person Deffiss    schedule 25.09.2013
comment
Я создал zip-файл со всеми этими изображениями, после чего вычисляю byte[] этого zip-файла и отправляю его byte[] в службу wcf. Я пробовал transferMode="Streamed", но не работает - person Ajay; 25.09.2013
comment
Я использовал transferMode Streamed. Я изменил свой код после вашего предложения. - person Ajay; 25.09.2013
comment
Хорошо, рад помочь вам. - person Deffiss; 25.09.2013
comment
Возможно, эта ссылка поможет в потоковой передаче. - person Deffiss; 25.09.2013