1

我在几个地方看到过这样的问题,但我还没有看到对我有帮助的答案。希望您能提供帮助!

情况:

  • 使用 .NET 工作站客户端将文件上传到由 Tomcat 支持的 Apache Web 服务器。
  • 小文件工作得很好。较大的文件 POSTS 被 .copyto 命令周围的 http 错误 401 拒绝。随后的 GetResponse 错误并显示消息“远程服务器返回错误:(502)错误网关。代理服务器收到来自上游服务器的无效响应”立即看到错误。这不是超时。
  • CURL 可以毫无问题地上传相同的“大”文件。
  • 术语“小”和“大”是相对的:小 = 88 字节。大 = 3.17 MB。我知道这个“大”文件对于大多数用途来说都很小。

所以,问题一定出在我的代码中。这是该代码的简化形式(省略了异常处理程序)。

    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
4

1 回答 1

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()
于 2018-04-12T22:35:54.760 回答