Передача больших файлов с использованием веб-форм WCF и ASP.NET - PullRequest
3 голосов
/ 14 июня 2011

Я пытаюсь загрузить большие файлы (до 200 МБ) через веб-формы ASP.NET и сохранить их в базе данных. Я могу загружать большие файлы с помощью элемента управления FileUpload, и я настроил поле в SQL Server как VarBinary (MAX) FileStream для внешнего хранения файлов. Я хочу перенести загруженный файл с помощью службы WCF в базу данных, и вот где я застрял. Единственная проблема, которая у меня возникает, - это когда я пытаюсь передать файл из кода в службу WCF.

Настройка : Клиент web.config в приложении ASP.NET

<system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="BasicHttpBinding_IFileTransfer" maxReceivedMessageSize="2147483647"
                 maxBufferSize="2147483647" maxBufferPoolSize="2147483647"
                 transferMode="Streamed" messageEncoding="Mtom"
                 sendTimeout="24.20:31:23.6470000" receiveTimeout="24.20:31:23.6470000">
          <readerQuotas maxArrayLength="2147483647" maxBytesPerRead="2147483647"
                        maxDepth="2147483647" maxStringContentLength="2147483647"/>
          <security mode="None">
            <transport clientCredentialType="None" proxyCredentialType="None"
              realm="" />
            <message clientCredentialType="UserName" algorithmSuite="Default" />
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>
    <client>
      <endpoint address="http://localhost:25333/FileTransfer.svc" binding="basicHttpBinding"
        bindingConfiguration="BasicHttpBinding_IFileTransfer" contract="FileTransfer.IFileTransfer"
        name="BasicHttpBinding_IFileTransfer" />
    </client>
  </system.serviceModel>

Сервер web.config в приложении WCF

<system.serviceModel>
    <services>
      <service name="Ward.POC1.FileStream">
        <endpoint address="ep1" binding="basicHttpBinding" contract="WcfServiceHost.IFileTransfer">
          <identity>
            <dns value="localhost" />
            <certificateReference storeName="My" storeLocation="LocalMachine"
              x509FindType="FindBySubjectDistinguishedName" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
      </service>
    </services>
    <bindings>
      <basicHttpBinding>
        <binding maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" 
                 maxBufferPoolSize="2147483647"
                 transferMode="Streamed" messageEncoding="Mtom" 
                 sendTimeout="24.20:31:23.6470000" receiveTimeout="24.20:31:23.6470000">
          <readerQuotas maxArrayLength="2147483647" maxBytesPerRead="2147483647" 
                        maxDepth="2147483647" maxStringContentLength="2147483647"/>
        </binding>
      </basicHttpBinding>
    </bindings>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="True"/>
          <serviceDebug includeExceptionDetailInFaults="False"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
  </system.serviceModel>

Я использовал TransferMode = "Streamed" со следующим определением контракта:

[ServiceContract]
public interface IFileTransfer
{
    [OperationContract]
    Stream GetFile(Guid fileId);

    [OperationContract]
    void AddFile(Stream fileStream);
}

В зависимости от изменения параметров конфигурации я получаю следующее исключение:

Соединение с сокетом было прервано. Это может быть вызвано ошибкой обработки вашего сообщения или превышением тайм-аута приема удаленным хостом, или проблемой основного сетевого ресурса. Тайм-аут локального сокета был '24 .20: 31: 23.6100000'.

или

WCF Удаленный сервер возвратил ошибку: (400) Неверный запрос.

Может ли кто-нибудь дать мне руководство по передаче загруженных больших файлов между ASP.NET и другим размещенным приложением с помощью WCF? Я пытаюсь с потоковым. Если у кого-то есть элегантное решение с использованием двоичного массива / чанкинга, то это тоже приветствуется.

1 Ответ

0 голосов
/ 06 октября 2011

https://skydrive.live.com/?cid=41ce408c159c69ea&sc=documents&id=41CE408C159C69EA%21321

У меня была похожая проблема.Я принимал WCF как сервис WAS, и он работал нормально.Это как-то связано с configuraton, и я не уверен, что это такое?

Кроме того, я заметил еще одну интересную вещь: если я сохраню код в коде, сгенерированном самим WCF, он работает.(Конфигурация мтом / стрим).Но если я разделю код позади (интерфейс и реализацию) на другой каталог, это не получится.В итоге я использовал тот же код с WAS вместо IIS, и все работает отлично.

...