XMLHttpRequest не получает ответа
Привет, в настоящее время я использую загрузчик файлов на своем веб-сайте для загрузки файлов в свою базу данных. Перед загрузкой файла мне нужно выполнить некоторую проверку, которая может быть выполнена только на стороне сервера, так как он должен получить доступ к базе данных. Загрузчик использует XMLHttpRequest, а мое приложение использует ASP.Чистые веб-формы. Проблема заключается в том, что если проверка завершается неудачно на стороне сервера и возвращается ошибка, то ответ не принимается на стороне клиента. Он работает правильно, если файл загружен или даже если проверка выполняется после загрузки файла. Во всяком случае, ниже приведен простой пример того, что я делаю.
Язык JavaScript
var xhr = this._xhrs[id] = new XMLHttpRequest(); xhr.onreadystatechange = function () { if (xhr.readyState == 4) { self._onComplete(id, xhr); } }; xhr.open("POST", queryString, true); xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest"); xhr.setRequestHeader("X-File-Name", encodeURIComponent(name)); xhr.setRequestHeader("Content-Type", "application/octet-stream"); xhr.send(file);
ГЛ.
Sub ProcessRequest(ByVal context As HttpContext) Implements HttpHandler.ProcessRequest Dim fileName As String = context.Request.QueryString("qqfile") if Not Database.IsValid(fileName) then begin context.Response.Write("{error:""Invalid file""}") Return end If Dim newFile As New FileStream(strPath + "\" + fileName, FileMode.Create) Dim body As Byte() = context.Request.BinaryRead(context.Request.TotalBytes) newFile.Write(body, 0, body.Length) newFile.Flush() newFile.Close() context.Response.Write("{success: true}") End Sub
Yuri Vital
Вы слушаете readyState == только 4 ...
Пробовали посмотреть, что происходит на ReadyState =3 ?
Вы видели, что добавляется во время связи клиент/сервер, захватывая пакет с помощью Fiddler (http://www.fiddler2.com/fiddler2/) ?
TimWatson123
Я не получаю readyState == 3 при возврате ошибки до того, как я загрузил файл, только после того, как я загрузил файл. Но я действительно получаю readyState == 1 и статус [исключение: DOMException]. Есть идеи, почему?
Yuri Vital
readyState == 1 означает "соединение открыто" смотрите здесь : http://www.w3.org/TR/XMLHttpRequest/#event-handler-attributes
Вы пробовали ответить просто : {success: false}
???
TimWatson123
Да, я пробовал это сделать, но ничего не вышло.
Если я вызову запрос.TotalBytes перед возвращением кода ошибки он работает. Единственная проблема заключается в том, что TotalBytes зависает до тех пор, пока полный файл не будет загружен на сервер. По какой-то причине я получаю только readyStates 1 и 4 при возврате перед загрузкой. Я думаю, что это моя главная проблема:
"responseText типа DOMString
Если атрибут readyState имеет значение, отличное от 3 (Receiving) или 4 (Loaded), то это должна быть пустая строка. В противном случае это должно быть тело полученных до сих пор данных, интерпретированных с использованием кодировки символов, указанной в ответе, или UTF-8, если кодировка символов не была указана. Недопустимые байты должны быть преобразованы в символ замены U+FFFD."
http://www.w3.org/TR/2006/WD-XMLHttpRequest-20060405/#dfn-readystate
Пытаюсь ли я установить текст ответа, когда readyState не равен 3 или 4? Если да, то есть ли способ заставить readyState измениться на 3 или 4 серверную сторону перед установкой текста ответа?