C# 写入响应头后服务器关闭连接时出现HttpClient异常

C# 写入响应头后服务器关闭连接时出现HttpClient异常,c#,http,dotnet-httpclient,C#,Http,Dotnet Httpclient,我正在使用HttpClient使用PutAsync将数据放入HTTP服务器 当服务器发回错误代码(例如401 Unauthorized)时,它会关闭连接(在响应中提供了连接:close标头)。发生这种情况时,HttpClient抛出System.Net.Http.HttpRequestException(将内容复制到流时出错),内部异常如下所示。这似乎与将数据写出来有关(尽管它是在beginhead中),因为如果我说服服务器读取所有发送的数据,那么不会抛出异常 我可以通过使用HttpClient

我正在使用
HttpClient
使用
PutAsync
将数据放入HTTP服务器

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

我可以通过使用
HttpClient.SendAsync
使用
HttpCompletionOption.ResponseHeadersRead
参数执行相同的任务来解决这个问题。在这种情况下,不会引发异常,我可以读取
HttpResponseMessage.StatusCode

我的问题是,例外是否正确?i、 e.服务器是否未遵循标准,即关闭连接而不读取其不需要的所有数据?如果没有,那么在这种情况下,
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(无法从传输连接读取数据:远程主机强制关闭了现有连接。)

内部异常:System.Net.Sockets.SocketException(远程主机强制关闭了现有连接)


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

using (HttpRequestMessage req = new HttpRequestMessage
    {
        Method = HttpMethod.Put,
        RequestUri = new Uri(baseUri, Path),
        Content = content,
        Version = HttpVersion.Version10
    })
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)
using (HttpRequestMessage req = new HttpRequestMessage
    {
        Method = HttpMethod.Put,
        RequestUri = new Uri(baseUri, Path),
        Content = content,
        Version = HttpVersion.Version10
    })