上传大文件到Azure db给出错误(ASP.网网站)
本文关键字:错误 ASP 网站 出错 文件 db Azure | 更新日期: 2023-09-27 18:10:49
我创建了一个简单的asp.net网站。只有一个页面,有一个文件上传控件和一个上传按钮。它应该是这样工作的:当用户浏览到文件并单击上传时,它将实际文件保存到我的AZURE数据库中的新记录中。
对于小文件它工作得很好。对于更大的文件,比如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):
在我的网上。我已经添加了以下代码片段....
<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数据库,我需要任何额外的配置吗?
示例上传代码....
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
IIS 7的上限为30 MB,请参阅此链接了解更多信息。这样做的原因是,在上传过程中,ASP。NET在用户将文件保存到磁盘或进一步处理之前将整个文件加载到内存中——换句话说,没有流。您可以尝试将以下内容添加到Azure角色启动任务:
appcmd set config "My Site/MyApp" -section:requestFiltering -requestLimits.maxAllowedContentLength:104857600 -commitpath:apphost
可以扩展到超过IIS 30mb的限制,但是我自己没有尝试过。
英奇的话有道理。也可以是与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
}
}
对于。net core 3, Azure SQL数据库和实体框架,添加CommandTimeout帮助了我。
services.AddDbContext<YourDbContext>(options => options.UseSqlServer(
this.Configuration.GetConnectionString("YourConnectionString"),
sqlServerOptions => sqlServerOptions.CommandTimeout(60))
);