C# HttpClient GetAsync 异常"The server returned an invalid or unrecognized response"



这似乎是一个随机问题。有时GetAsync会成功获得响应(200/OK)。其他时候,它抛出异常。我认为这与"Transfer-Encoding: chunked"有关。顺便说一句……流文件的大小从8MB到300MB不等

下面是我的相关代码:

HttpResponseMessage response = null;
try
{
HttpClient httpClient = new HttpClient
{
Timeout = TimeSpan.FromSeconds(60)
};
httpClient.DefaultRequestHeaders.Add("Accept", "multipart/related; type="application/dicom"");
response = await httpClient.GetAsync(uri);
if (response.StatusCode != HttpStatusCode.OK)
{
Console.WriteLine($"Response:[{response}]");
return false;
}
}
catch (Exception e)
{
Console.WriteLine($"Exception:[{e.Message}] | Stack:[{e.StackTrace}] | InnerEx:[{e.InnerException}]");
return false;
}

GetAsync成功(200/OK)时的HttpResponseMessage:

{
"Version": {
"Major": 1,
"Minor": 1,
"Build": -1,
"Revision": -1,
"MajorRevision": -1,
"MinorRevision": -1
},
"Content": {
"Headers": [
{
"Key": "Content-Type",
"Value": [ "multipart/related; boundary=Boundary_77_676776408_1611644859244; type="application/dicom"" ]
}
]
},
"StatusCode": 200,
"ReasonPhrase": "OK",
"Headers": [
{
"Key": "Transfer-Encoding",
"Value": [ "chunked" ]
},
{
"Key": "MIME-Version",
"Value": [ "1.0" ]
},
{
"Key": "Date",
"Value": [ "Tue, 26 Jan 2021 07:07:39 GMT" ]
},
{
"Key": "Proxy-Connection",
"Value": [ "Keep-Alive" ]
},
{
"Key": "Connection",
"Value": [ "Keep-Alive" ]
},
{
"Key": "Age",
"Value": [ "0" ]
}
],
"RequestMessage": {
"Version": {
"Major": 2,
"Minor": 0,
"Build": -1,
"Revision": -1,
"MajorRevision": -1,
"MinorRevision": -1
},
"Content": null,
"Method": { "Method": "GET" },
"RequestUri": "http://1.2.3.4:5007/blah/blah1/11/blah2/22/blah3/33",
"Headers": [
{
"Key": "Accept",
"Value": [ "multipart/related; type="application/dicom"" ]
}
],
"Properties": {}
},
"IsSuccessStatusCode": true
}

其他时候没有响应并抛出异常:

异常:[服务器返回无效或无法识别的响应。][at System.Net.Http.HttpConnection.ThrowInvalidHttpResponse()]在System.Net.Http.HttpConnection.ChunkedEncodingReadStream。ReadChunkFromConnectionBuffer(Int32 maxBytesToRead, CancellationTokenRegistration cancellationRegistration)在System.Net.Http.HttpConnection.ChunkedEncodingReadStream。CopyToAsyncCore(流目的地,CancellationToken)在System.Net.Http.HttpConnection.HttpConnectionResponseContent。SerializeToStreamAsync(Stream Stream, TransportContext context, CancellationToken)在System.Net.Http.HttpContent。LoadIntoBufferAsyncCore(任务serializeToStreamTask, MemoryStream tempBuffer)在System.Net.Http.HttpClient。FinishSendAsyncBuffered(任务1 sendTask, HttpRequestMessage请求,CancellationTokenSource cts,布尔处置)在myapp。GetBlahAsync(Uri Uri, String newFileName) in C:blahSvc.cs:line 97] | InnerEx:[]

是因为您需要反序列化响应

HttpResponseMessage response = null;
try
{
HttpClient httpClient = new HttpClient {
Timeout = TimeSpan.FromSeconds(60)
};
httpClient.DefaultRequestHeaders.Add("Accept", "multipart/related; type="application/dicom"");
response = await httpClient.GetAsync(uri);
if (response.IsSuccessStatusCode)
{
var responseData = await response.Content.ReadAsStringAsync();
var options = new JsonSerializerOptions() { PropertyNameCaseInsensitive = true };
var result = JsonSerializer.Deserialize<Root>(responseData, options);
Console.WriteLine($"Response:[{result }]");
return result;
}
}
catch (Exception e)
{
Console.WriteLine($"Exception:[{e.Message}] | Stack:[{e.StackTrace}] | InnerEx:[{e.InnerException}]");
return false;
}

为您的json转换为c#类使用这个网站json到c#类

// Root myDeserializedClass = JsonConvert.DeserializeObject<Root>(myJsonResponse); 
public class Version    {
public int Major { get; set; } 
public int Minor { get; set; } 
public int Build { get; set; } 
public int Revision { get; set; } 
public int MajorRevision { get; set; } 
public int MinorRevision { get; set; } 
}

public class Header    {
public string Key { get; set; } 
public List<string> Value { get; set; } 
}

public class Content    {
public List<Header> Headers { get; set; } 
}

public class Method    {
public string Method { get; set; } 
}

public class Properties    {
}

public class RequestMessage    {
public Version Version { get; set; } 
public object Content { get; set; } 
public Method Method { get; set; } 
public string RequestUri { get; set; } 
public List<Header> Headers { get; set; } 
public Properties Properties { get; set; } 
}

public class Root    {
public Version Version { get; set; } 
public Content Content { get; set; } 
public int StatusCode { get; set; } 
public string ReasonPhrase { get; set; } 
public List<Header> Headers { get; set; } 
public RequestMessage RequestMessage { get; set; } 
public bool IsSuccessStatusCode { get; set; } 
}

或visual studio中的Edit->Paste Special->Paste JSON As Classes

相关内容

最新更新