gpt4 book ai didi

c# - 服务器在写入响应 header 后关闭连接时出现 HttpClient 异常

转载 作者:太空狗 更新时间:2023-10-29 22:01:01 26 4
gpt4 key购买 nike

我正在使用 HttpClient 使用 PutAsync 将数据 PUT 到 HTTP 服务器。

当服务器发回错误代码(例如 401 Unauthorized)时,它会关闭连接(在其响应中提供了 Connection: close header )。发生这种情况时,HttpClient 会抛出 System.Net.Http.HttpRequestException(将内容复制到流时出错),内部异常如下所示。这似乎与写出数据有关(尽管它在 BeginRead 中),因为如果我说服服务器读取所有正在发送的数据,则不会抛出异常。

我可以通过使用 HttpClient.SendAsyncHttpCompletionOption.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
}
}
}

内部异常: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()

有内部异常: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)

最佳答案

如果适合您的需要,请尝试使用 HTTP 协议(protocol)版本 1.0:

using (HttpRequestMessage req = new HttpRequestMessage
{
Method = HttpMethod.Put,
RequestUri = new Uri(baseUri, Path),
Content = content,
Version = HttpVersion.Version10
})

关于c# - 服务器在写入响应 header 后关闭连接时出现 HttpClient 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21285306/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com