Приложение 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()
Другие вопросы по тегам