Nat*_*ips 6 c# http dotnet-httpclient
我正在使用HttpClientPUT数据到HTTP服务器PutAsync.
当服务器发回错误代码(例如401 Unauthorized)时,它会关闭连接(在响应中提供了Connection:close标头).当发生这种情况时,HttpClient会抛出System.Net.Http.HttpRequestException(将内容复制到流时出错),并列出下面列出的内部异常.这似乎与写入数据有关(尽管事实上它在BeginRead中),因为如果我说服服务器读取所有正在发送的数据,则不会抛出异常.
我可以通过使用HttpClient.SendAsync与HttpCompletionOption.ResponseHeadersRead参数执行相同的任务来解决此问题.在这种情况下,不抛出异常,我可以阅读HttpResponseMessage.StatusCode.
我的问题是,异常是正确的吗?即,服务器没有遵循标准,关闭连接而不读取它不需要的所有数据?如果没有,那么是否存在问题,PutAsync因为StatusCode在这种情况下它不允许访问返回?
示例代码:
using (FileStream stream = File.OpenRead(FilePath))
using (StreamContent content = new StreamContent(stream))
using (HttpRequestMessage req = new HttpRequestMessage
{
Method = HttpMethod.Put,
RequestUri = new Uri(baseUri, Path),
Content = content,
})
using (HttpClient client = new HttpClient())
{
req.Content.Headers.ContentType = new MediaTypeHeaderValue(FileContentType);
// This version works:
//using (HttpResponseMessage resp = await client.SendAsync(req,
// HttpCompletionOption.ResponseHeadersRead))
// This version throws an exception:
using (HttpResponseMessage resp = await client.PutAsync(
new Uri(baseUri, Path), content))
{
if (resp.StatusCode == HttpStatusCode.Unauthorized)
{
// Try again with authorisation credentials based on resp.Headers.WwwAuthenticate
}
}
}
Run Code Online (Sandbox Code Playgroud)
内部异常:System.IO.IOException(无法从传输连接读取数据:远程主机强制关闭现有连接.)
at System.Net.Sockets.NetworkStream.BeginRead(Byte[] buffer, Int32 offset, Int32 size, AsyncCallback callback, Object state)
at System.Net.PooledStream.BeginRead(Byte[] buffer, Int32 offset, Int32 size, AsyncCallback callback, Object state)
at System.Net.ConnectStream.BeginReadWithoutValidation(Byte[] buffer, Int32 offset, Int32 size, AsyncCallback callback, Object state)
at System.Net.ConnectStream.BeginRead(Byte[] buffer, Int32 offset, Int32 size, AsyncCallback callback, Object state)
at System.Net.Http.HttpClientHandler.WebExceptionWrapperStream.BeginRead(Byte[] buffer, Int32 offset, Int32 count, AsyncCallback callback, Object state)
at System.Net.Http.StreamToStreamCopy.StartRead()
Run Code Online (Sandbox Code Playgroud)
内部异常:System.Net.Sockets.SocketException(远程主机强制关闭现有连接)
at System.Net.Sockets.Socket.BeginReceive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags, AsyncCallback callback, Object state)
at System.Net.Sockets.NetworkStream.BeginRead(Byte[] buffer, Int32 offset, Int32 size, AsyncCallback callback, Object state)
Run Code Online (Sandbox Code Playgroud)
如果符合您的需求,请尝试使用 HTTP 协议版本 1.0:
using (HttpRequestMessage req = new HttpRequestMessage
{
Method = HttpMethod.Put,
RequestUri = new Uri(baseUri, Path),
Content = content,
Version = HttpVersion.Version10
})
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3691 次 |
| 最近记录: |