Загрузка большого файла из xmlhttprequest в wcf прекращается через 2 минуты - PullRequest
0 голосов
/ 20 сентября 2018

Я загружаю файл из 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 передачи завершается к моменту остановки)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...