Я загружаю файл из Chrome в автономный сервис WCF, и через 2 минуты загрузка файла останавливается.Еще через 2 минуты xhr.send вызывает onreadystatechange с бессмысленным статусом 0.
Код браузера:
var xhr = new XMLHttpRequest();
xhr.open('POST', '/upload?filename=' + encodeURIComponent(fileToUpload.serverFilename), true);
xhr.upload.onprogress = function (e) {
if (e.lengthComputable) {
progress.setValue(e.loaded / e.total);
}
};
xhr.onreadystatechange = function () {
$.unblockUI();
if (xhr.readyState === 4) {
if (xhr.status === 200) {
if (onSuccess !== undefined) onSuccess(fileToUpload);
} else {
alert('Upload Error', 'File: ' + fileToUpload.filename + '<br><bror: ' + xhr.status + ' ' + xhr.statusText);
if (onError !== undefined) onError();
}
}
};
xhr.ontimeout = function () {
// this is not getting called
console.log('transfer timed out')
}
xhr.send(fileToUpload.file);
Серверный хостинг:
mzServerHost = New ServiceHost(GetType(WebAppServer))
Dim zHttpAddress As New Uri("http" & If(mUseHttps, "s", "") & "://" & mUrl & "/")
Dim zContract As Type = GetType(IWebAppServer)
Dim binding As New WebHttpBinding
binding.MaxReceivedMessageSize = 200000000
' 10 minute timeout to allow large file transfers - doesn't work
binding.OpenTimeout = New TimeSpan(0, 10, 0)
binding.CloseTimeout = New TimeSpan(0, 10, 0)
binding.ReceiveTimeout = New TimeSpan(0, 10, 0)
binding.SendTimeout = New TimeSpan(0, 10, 0)
Dim zHttpEndpoint As ServiceEndpoint = mzServerHost.AddServiceEndpoint(zContract, binding, zHttpAddress)
zHttpEndpoint.Behaviors.Add(New WebHttpBehavior)
mzServerHost.Open()
Контракт:
<OperationContract()>
<DataContractFormat>
<WebInvoke(Method:="POST", BodyStyle:=WebMessageBodyStyle.Bare, ResponseFormat:=WebMessageFormat.Json, UriTemplate:="upload?filename={filename}")>
Function Upload(ByVal filename As String, ByVal file As Stream) As String
Функция загрузки:
Public Function Upload(ByVal filename As String, file As Stream) As String Implements IWebAppServer.Upload
Try
session = WebApp.Sessions.GetSession()
UserCallContext.WebSession = session
session.LastCall = Now
Dim filepath As String = Path.Combine(session.Filestore, filename)
Using writer As New FileStream(filepath, FileMode.Create)
Dim buffer(8192) As Byte
Dim readCount As Integer = file.Read(buffer, 0, buffer.Length)
Do While readCount <> 0
writer.Write(buffer, 0, readCount)
readCount = file.Read(buffer, 0, buffer.Length)
Loop
End Using
Return filepath
Catch ex As Exception
Console.WriteLine(ex.ToString)
Throw ex
End Try
End Function
Я установил тайм-ауты WCF на сервере, хотя 2 минуты не являются значениями по умолчанию, но безрезультатно.
Что приводит к остановке загрузки через 2 минуты, а затем вызывает вызов xhr.onreadstatechange через 2 минуты?
Размер тестового файла составляет около 50 МБ, и он отлично работает при размещении на локальном компьютере.(и переводит через пару секунд).Проблема возникает только при размещении на удаленном компьютере с более медленным сетевым подключением (3/4 передачи завершается к моменту остановки)