У меня трехуровневая архитектура приложения.
Мой клиент -> Моя служба A (REST размещен в IIS) -> Служба другой команды X ( REST).
Service A - это ASP. Net 4.6.1 framework, а не ASP. Net Core.
Клиент обменивается данными с A с помощью HttpClient, а A - это общение с X с помощью HttpClient.
Клиент запускает почти 2500 вызовов моей службы для A и X.
Из 2500 вызовов служба A случайным образом (может быть 10 вызовов) не работает с исключением ниже . Это не воспроизводится.
System.Net.Http.HttpRequestException: An error occurred while sending the request. --->
System.Net.WebException: The underlying connection was closed: An unexpected error occurred on a
receive. ---> System.IO.IOException: Unable to read data from the transport connection: An
established connection was aborted by the software in your host machine. --->
System.Net.Sockets.SocketException: An established connection was aborted by the software in your
host machine
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)
--- End of inner exception stack trace ---
at System.Net.Security._SslStream.EndRead(IAsyncResult asyncResult)
at System.Net.TlsStream.EndRead(IAsyncResult asyncResult)
at System.Net.Connection.ReadCallback(IAsyncResult asyncResult)
--- End of inner exception stack trace ---
at System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
at System.Net.Http.HttpClientHandler.GetResponseCallback(IAsyncResult ar)
--- End of inner exception stack trace --
Вот моя услуга Звонок. A в IIS вызывает нижеприведенный блок кода и вызывается каждым запросом. X принимает учетные данные пользователя и возвращает данные в зависимости от пользователя, поэтому мы не разделяем HttpClient между вызовами.
var user = (System.Security.Principal.WindowsIdentity)HttpContext.Current.User.Identity;
System.Security.Principal.WindowsIdentity.RunImpersonated(user.AccessToken, () =>
{
static HttpClient Client = new HttpClient();
static string CallX(string[] args)
{
HttpClientHandler handler = new HttpClientHandler
{
UseDefaultCredentials = true
};
Client = new HttpClient(handler)
{
BaseAddress = new Uri("http://XserviceUrl/api/")
};
Client.Timeout = TimeSpan.FromSeconds(600);
var result = Client.PostAsync("Fake X controller"
, new StringContent(JsonConvert.SerializeObject(args)
, Encoding.UTF8, "application/json")).Result;
result.EnsureSuccessStatusCode();
var json = result.Content.ReadAsStringAsync().Result;
return DosomethingWithResult(json);
}
});
Вещи, которые я пробовал:
Некоторые предлагаемые сообщения SO могут быть проблемой тайм-аута. Поэтому я добавил 600 секунд в Client и Service A. Я также изменил время ожидания запроса IIS с 2 минут по умолчанию на 10 (600 секунд).