17 января 09:32, одна из наших служб внезапно начала выбросить 500 ошибок. Это сервис-адаптер для сторонней службы, и мы используем HttpClient для создания POST (поэтому мы делаем GET для нашей службы с параметрами строки запроса, и мы передаем это стороннему приложению с помощью POST и параметров в тело). Когда я отправляю третью сторону вручную, используя почтальон или завиток, он ответил отлично. Так что это была проблема с нашим сервисом. Это .NET-сервис, который использует промежуточное ПО OWIN, похожее на то, как работает ядро .NET. Проблема состояла в том, что некоторое время назад инфраструктура .NET была обновлена с 4.5.2 до 4.6, и при выполнении этого в VS она добавляет элемент <httpRuntime targetFramework="4.5.2"/>
в web.config. Это должно сделать все возможное, чтобы сохранить существующее поведение приложения в случае каких-либо изменений в рамочных версиях. Человек, который обновил, не реализовал и не оставил элемент в 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, и есть некоторые потенциально разрушающие изменения вокруг HttpClient
, если не использовать TLSv1.0 + в качестве протокола, я проверил использование Wireshark на одном из серверов, и мы используем TLSv1.2 , Но это не объясняет, почему это внезапно прекратилось.
Update - Выход из 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.
Update 2 - Удалены ненужные журналы ^^
_ «Когда я отправляю на службу третьей стороны, вручную с помощью почтальона или локон, он ответил хорошо. Так что это была проблема с нашим сервисом [...] Третья сторона не вносить никаких изменений» _ - то, что отличается, - это время, когда запрос был выполнен. Возможно, сторонняя служба была перегружена на данный момент, в процессе обновления или что-то еще. Если запущена .NET 4.5.2, эта ошибка возникает, и .NET 4.6 не работает, а затем просматривайте различия в заголовках HTTP между ними. – CodeCaster
«принудительно закрыт удаленным хостом» отлаживает проблему с неправильного конца сокета. Листья не догадываются, почему другой конец решил отказаться. Следуйте за проводом. –
@HansPassant другой конец сокета - стороннее приложение, к которому у меня нет доступа. Я связался с их группой поддержки, и они сказали, что не могут видеть никаких запросов. – Rodders