Приложение DotNet получает шлюз 502 (ошибка прокси-сервера) - после публикации большого файла на веб-сервере
Я видел подобные вопросы в нескольких местах, но я не видел ответа, который бы мне помог. Надеюсь, что вы можете помочь!
Ситуация:
- Загрузка файлов с помощью клиента рабочей станции.NET на веб-сервер Apache, поддерживаемый Tomcat.
- Небольшие файлы работают просто отлично. Большие файлы POSTS отклоняются с ошибкой http 401 вокруг команды.copyto. Последующие ошибки GetResponse выходили с сообщением "Удаленный сервер возвратил ошибку: (502) Bad Gateway. Прокси-сервер получил недопустимый ответ от вышестоящего сервера" Ошибка появляется сразу. Это не время ожидания.
- CURL может загрузить тот же "большой" файл без проблем.
- Термины "маленький" и "большой" являются относительными: маленький = 88 байтов. большой = 3,17 МБ. Я понимаю, что этот "большой" файл крошечный для большинства целей.
Итак, проблема должна быть в моем коде. Вот упрощенная форма этого кода (без учета обработчиков исключений).
Dim request As HttpWebRequest = CType(WebRequest.Create("http://mysite"), HttpWebRequest)
request.Method = "POST"
request.Credentials = New NetworkCredential("userid","password")
request.ContentType = "application/octet-stream"
request.SendChunked = True
request.UserAgent = "Support Tools"
request.CookieContainer = New CookieContainer
Using fileStream As Stream = New FileStream("C:\sourceFile", FileMode.Open)
request.ContentLength = fileStream.Length
Dim uploadStream As Stream = request.GetRequestStream
fileStream.CopyTo(uploadStream)
End Using
Dim response As WebResponse = request.GetResponse()
Спасибо за ваше время.
По запросу, вот полный код. Обратите внимание, что он зависит от переменных, определенных в другом месте класса.
Public Sub SubmitFileToSis(ByVal operation As String, ByVal sourceFile As String)
Dim request As HttpWebRequest = WebRequest.Create(_EndPoints(operation.ToLower))
request.Method = "POST"
request.Credentials = New NetworkCredential(_SisUserId, _SisUserPassword)
request.ContentType = "application/octet-stream"
request.SendChunked = True
request.UserAgent = "Support Tools"
request.CookieContainer = New CookieContainer
Try
Using fileStream As Stream = New FileStream(sourceFile, FileMode.Open)
request.ContentLength = fileStream.Length
Dim uploadStream As Stream = request.GetRequestStream
fileStream.CopyTo(uploadStream)
End Using
Catch ex As WebException
If (ex.Status = WebExceptionStatus.ProtocolError) Then
Dim response As WebResponse = ex.Response
Using sr As StreamReader = New StreamReader(response.GetResponseStream())
_SubmissionResult = String.Format("Error Uploading: {0} - {1} - {2}", ex.Status.ToString, ex.Message, sr.ReadToEnd())
End Using
Else
_SubmissionResult = String.Format("Error Uploading: {0} - {1} ", ex.Status.ToString, ex.Message)
End If
Exit Sub
Catch ex As Exception
_SubmissionResult = String.Format("Error Uploading: {0} ", ex.Message)
Exit Sub
End Try
Try
Dim response As WebResponse = request.GetResponse()
Using sr As New StreamReader(response.GetResponseStream(), Encoding.UTF8)
_SubmissionResult = sr.ReadToEnd()
End Using
_SubmittedDataSetUid = GetBetween(_SubmissionResult, "reference code ", " to track")
Catch ex As WebException When (ex.Status = WebExceptionStatus.ProtocolError)
If (ex.Status = WebExceptionStatus.ProtocolError) Then
Dim response As WebResponse = ex.Response
Using sr As StreamReader = New StreamReader(response.GetResponseStream())
_SubmissionResult = String.Format("Error Reading Response: {0} - {1} - {2}", ex.Status.ToString, ex.Message, sr.ReadToEnd())
End Using
Else
_SubmissionResult = String.Format("Error Reading Response: {0} - {1} ", ex.Status.ToString, ex.Message)
End If
Exit Sub
Catch ex As Exception
_SubmissionResult = String.Format("Error Reading Response: {0} ", ex.Message)
Exit Sub
End Try
End Sub
1 ответ
Эврика!! Мне нужно было добавить "Авторизация" в заголовки HttpWebRequest. Было несколько других незначительных изменений, но они были для удобочитаемости и чистоты.
Новый рабочий шаблон (по крайней мере, для стадии сканирования):
Dim request As HttpWebRequest = WebRequest.Create("http://mysite")
request.Method = WebRequestMethods.Http.Post
request.Credentials = New NetworkCredential("userid","password")
request.ContentType = "application/octet-stream"
request.SendChunked = True
request.UserAgent = "Support Tools"
request.CookieContainer = New CookieContainer
Dim authInfo As String = Convert.ToBase64String(Encoding.UTF8.GetBytes(String.Format("{0}:{1}", "userid","password")))
request.Headers.Add("Authorization", String.Format("Basic {0}", authInfo))
Using fileStream As Stream = New FileStream("C:\sourceFile", FileMode.Open, FileAccess.Read)
request.ContentLength = fileStream.Length
Dim uploadStream As Stream = request.GetRequestStream
fileStream.CopyTo(uploadStream)
End Using
Dim response As WebResponse = request.GetResponse()