在1月17日09:32,我們的一個服務突然開始拋出500個錯誤。它是一個適用於第三方服務的適配器服務,我們使用HttpClient對其進行POST(因此,我們使用查詢字符串參數對我們的服務進行GET,然後使用POST和參數傳遞給第三方應用程序身體)。當我用postman或curl手動發佈到第三方服務時,它的響應很好。所以這是我們服務的問題。它是使用OWIN中間件的.NET服務,類似於.NET核心的工作方式,我認爲。問題是,前一段時間,.NET框架從4.5.2升級到4.6,並且在VS中執行此操作時,它會在web.config中添加一個<httpRuntime targetFramework="4.5.2"/>
元素。這是爲了盡最大努力保留應用程序的現有行爲,以防在框架版本之間發生任何重大變化。升級的人沒有意識到並留在web.config中的元素中。它運行良好很長時間,然後突然在所有環境中同時(包括本地)被搗毀。我認爲它在.NET框架中必須與時間相關,但是將我的系統時鐘恢復無法修復它!我可以尋找什麼,關於這個謎團的任何想法?簡單地將web.config修改爲4.6可以修復它,但我一直負責調查它。服務突然拋出SocketException,沒有明顯的變化
這裏是底層錯誤:
System.Net.Sockets.SocketException (0x80004005): An existing connection was forcibly closed by the remote host
at System.Net.Sockets.Socket.EndReceive(IAsyncResult asyncResult)
at System.Net.Sockets.NetworkStream.EndRead(IAsyncResult asyncResult)
,這是代碼,它引發在_client.PostAsync
與上述作爲的InnerException。 _client是System.Net.Http.HttpClient
public async Task<CalculateResponse> Calculate(CalculateRequest request)
{
var env = new RequestEnvelope { Body = { RblsCalculate = request } };
request.LoginId = _username;
request.Password = _password;
var body = XmlConvert.SerializeObject(env);
var content = new StringContent(body, Encoding.UTF8, "application/soap+xml");
var httpResponse = await _client.PostAsync(_endpointPath, content);
var response = XmlConvert.ToObject<ResponseEnvelope>(await httpResponse.Content.ReadAsStreamAsync());
return response?.Body?.RblsCalculateResponse;
}
第三方沒有做任何改動,Windows更新沒有運行(這同時完成5個不同的環境)。我們沒有做任何改變。部署時,我們每次都部署一個新實例,web.config在服務器上沒有更改,之前的部署是在幾周前完成的。
我已經檢查了4.6的一些變化,如果不使用TLSv1.0 +作爲協議,有一些潛在的HttpClient
變更可能發生的變化,我在一臺服務器上使用Wireshark進行了檢查,我們使用的是TLSv1.2 。但這並不能解釋爲什麼突然停止。
更新 - 輸出從trace.log中爲SSL/TLS跟蹤按@Trumpi建議
System.Net.Sockets Verbose: 0 : [16292] Data from Socket#52088480::PostCompletion
System.Net.Sockets Verbose: 0 : [16292] 00000000 : 16 03 01 00 88 01 00 00-84 03 01 58 A4 49 35 01 : ...........X.I5.
更新2 - 刪除了不必要的日誌^^
_「當我發佈到第三方服務使用郵遞員或捲曲手動,它精細的反應。因此,它與我們的服務有問題[...]第三方沒有做任何更改」 _ - 不同的是執行請求的時間。也許第三方服務目前超載,升級過程中或其他任何情況。如果運行.NET 4.5.2會一直出現此錯誤,而.NET 4.6則不會,那麼請檢查兩者之間HTTP標頭的差異。 – CodeCaster
「由遠程主機強制關閉」正在從錯誤的端口調試問題。不要猜測爲什麼另一端決定放棄。按照電線。 –
@HansPassant套接字的另一端是我無法訪問的第三方應用程序。我確實聯繫了他們的支持團隊,他們說他們看不到任何要求。 – Rodders