[英]Meaning of “The server returned an invalid or unrecognized response” in HttpClient
[英]C# HttpClient GetAsync exception “The server returned an invalid or unrecognized response”
這似乎是一個隨機問題。 有時 GetAsync 會成功獲得響應 (200/OK)。 其他時候它會拋出異常。 我認為這與“傳輸編碼:分塊”有關。 順便說一句...流式文件的大小從 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
}
其他時候沒有響應並拋出異常:
異常:[服務器返回無效或無法識別的響應。] | Stack:[ at System.Net.Http.HttpConnection.ThrowInvalidHttpResponse() at System.Net.Http.HttpConnection.ChunkedEncodingReadStream.ReadChunkFromConnectionBuffer(Int32 maxBytesToRead, CancellationTokenRegistration cancellationRegistration) at System.Net.Http.HttpConnection.ChunkedEncodingReadStream.CopyToAsyncCore(Stream destination, CancellationToken cancellationToken) at System.Net.Http.HttpConnection.HttpConnectionResponseContent.SerializeToStreamAsync(Stream stream, TransportContext context, CancellationToken cancellationToken) at System.Net.Http.HttpContent.LoadIntoBufferAsyncCore(Task serializeToStreamTask, MemoryStream tempBuffer) at System.Net.Http.HttpClient .FinishSendAsyncBuffered(Task`1 sendTask, HttpRequestMessage 請求, CancellationTokenSource cts, Z27226C864BAC7454A850 4F8EDB15D95BZ disposeCts) 在 myapp.GetBlahAsync(Uri uri, String newFileName) 在 C:\blah\Svc.cs:line 97] | 內殼:[]
是因為你需要反序列化響應
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;
}
for convert your json to c# class use this site Json to c# class
// 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.