Я пытаюсь загрузить большие файлы (до 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? Я пытаюсь с потоковым. Если у кого-то есть элегантное решение с использованием двоичного массива / чанкинга, то это тоже приветствуется.