2015-09-01 2 views
1

Я создал простой сайт asp.net. Есть только 1 страница с контролем загрузки файлов и кнопкой загрузки. Вот как это должно работать: когда пользователь просматривает файл и загружает его, он сохраняет фактический файл в новой записи в моей базе данных AZURE.Загрузка большого файла в Azure db дает ошибку (сайт ASP.NET)

С небольшими файлами он отлично работает. При больших файлов, таких как 45MB, он дает следующую ошибку ....

System.Data.SqlClient.SqlException (0x80131904): Timeout expired. The timeout period 
elapsed prior to completion of the operation or the server is not responding. 
---> System.ComponentModel.Win32Exception (0x80004005): 

В моей web.config я уже добавил следующие отрывки ....

<httpRuntime maxRequestLength="102400000" 
requestValidationMode="2.0" executionTimeout="12000" /> 
</system.web> 

И ....

<system.webServer> 
    <validation validateIntegratedModeConfiguration="false" /> 
    <modules runAllManagedModulesForAllRequests="true" /> 
    <security> 
     <requestFiltering> 
     <requestLimits maxAllowedContentLength="2147483648" /> 
     </requestFiltering> 
    </security> 

Любая идея, что может быть? Что мне не хватает? Существуют ли какие-либо дополнительные конфигурации, которые мне нужны, так как это Azure db?

код загрузки образца ....

Dim filename As String = Path.GetFileName(FileUpload1.PostedFile.FileName) 
      Dim contentType As String = FileUpload1.PostedFile.ContentType 
      Using fs As Stream = FileUpload1.PostedFile.InputStream 
       Using br As New BinaryReader(fs) 
        Dim bytes As Byte() = br.ReadBytes(fs.Length) 
        Dim constr As String = ConfigurationManager.ConnectionStrings("MyDb").ConnectionString 
        Using con As New SqlConnection(constr) 
         Dim query As String = "insert into MyFileTable values (@ActualDocument, @Filename)" 
         Using cmd As New SqlCommand(query) 
          cmd.Connection = con 
          cmd.Parameters.Add("@ActualDocument", SqlDbType.Binary).Value = bytes 
          cmd.Parameters.Add("@Filename", SqlDbType.VarChar).Value = filename 
          con.Open() 
          Dim i As Integer = cmd.ExecuteNonQuery() 
          Response.Write(i & " records<br/>") 
          con.Close() 
         End Using 
        End Using 
       End Using 
      End Using 
+1

Есть ли хранить такие большие файлы в базе данных SQL причина или требование? – CSharpRocks

+0

Я согласен с @CSharpRocks. Если вам нужно хранить большие файлы, попробуйте использовать OneDrive API для отправки файлов в OneDrive вместо SQL SERVER. Возможно, вам понадобится учетная запись Office365. –

+0

Можете ли вы опубликовать сегмент кода, который вы вызываете для загрузки файла. –

ответ

3

IIS 7 имеет колпачок 30 МБ, см this link for more info. Причина этого заключается в том, что во время процесса загрузки ASP.NET загружает весь файл в память, прежде чем пользователь сможет сохранить файл на диск или обработать его дальше - без потоковой передачи другими словами. Вы можете попробовать добавить следующее к Azure Role Startup Task:

appcmd set config "My Site/MyApp" -section:requestFiltering -requestLimits.maxAllowedContentLength:104857600 -commitpath:apphost 

продлить за пределы IIS 30 МБ, но я не пробовал сам.

+0

Отличная и полезная информация Инге! Благодаря! – WebDevGuy2

0

Что говорит Инге, имеет смысл. Это также может быть тайм-аут, связанный с SqlCommand.

Попробуйте изменить тайм-аут команды: https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.commandtimeout.aspx

using (SqlConnection connection = new SqlConnection(connectionString)) 
{ 
    connection.Open(); 
    SqlCommand command = new SqlCommand(queryString, connection); 
    // Setting command timeout to 60 seconds 
    command.CommandTimeout = 60; 
    try { 
     command.ExecuteNonQuery(); 
    } 
    catch (SqlException e) { 
     // do something with the exception 
    } 
} 
+1

Настройка CommandTimeout, похоже, сработала! Однако я буду проверять его, чтобы убедиться. – WebDevGuy2

Смежные вопросы