我在几个地方看到过这样的问题,但我还没有看到对我有帮助的答案。希望您能提供帮助!
情况:
- 使用 .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