Возникла ошибка "System.Net.Sockets.SocketException: соединение отказано" в Linux с.Net Core 2.2
Я столкнулся с проблемой Linux OS
с .Net Core 2.2
при выполнении некоторых интеграционных тестов. Вот трассировка стека:
Failed mytest () Сообщение об ошибке: System.Net.WebException: ошибка после 5 повторных попыток ----> System.Net.WebException: соединение отклонено. Соединение отклонено ----> System.Net.Http.HttpRequestException: соединение отклонено ----> System.Net.Sockets.SocketException: соединение отклонено. Трассировка стека: WebApiClient.cs: строка 56
WebApiClient.cs: строка 34 в PdsWebAppTests.ClientForTestPdsWebApp.Call(метод метода, строковый URL, заголовок String requestContent, WebClientHeaders) в ClientForTestPdsWebApp.cs: строка 19 в IntegrationTests.IntegrationTests1.mytest() in IntegrationTests.cs:line 44 --WebException at System.Net.HttpWebRequest.GetResponse() at WebApiClient.GetResponse(WebRequest webRequest) in WebApiClient.cs:line 117 at WebApiClient.ReceiveResponse(WebRequest webRequest) in WebApiClient.cs:line 97 CallWithRetries(Method method, String uriString, String requestContent, WebClientHeaders headers, Int32 retryCount) in WebApiClient.cs:line 46 --HttpRequestException at System.Net.Http.ConnectHelper.ConnectAsync(String host, Int32 port, CancellationToken cancellationToken) at System.Threading.Tasks.ValueTask
1.get_Result () в System.Net.Http.HttpConnectionPool.CreateConnectionAsync(запрос HttpRequestMessage, CancellationToken cancellationToken) в System.Threading.Tasks.ValueTask1.get_Result() at System.Net.Http.HttpConnectionPool.WaitForCreatedConnectionAsync(ValueTask
1 создание задания) в System.Threading.Tasks.ValueTask1.get_Result()
1 sendTask, запрос HttpRequestMessage, CancellationTokenSource cts, Boolean disposeCts) в System.Net.HttpWebRequest.SendRequest() в System.Net.HttpWebRequest.GetResponse() - Исключение Socket в System.Net.Http.Connect.AsteConnect.Con порт, отмена взята аннулирование взята)
at System.Net.Http.HttpConnectionPool.SendWithRetryAsync(HttpRequestMessage request, Boolean doRequestAuth, CancellationToken cancellationToken)
at System.Net.Http.RedirectHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) at System.Net.Http.HttpClient.FinishSendAsyncUnbuffered(Task
Вот мой поток кода высокого уровня:
public Response Call(Method method, string uriString, WebClientHeaders headers, string requestContent)
{
var response = CallWithRetries(method, uriString, requestContent, headers, NumberOfTimesToRetry); //WebApiClient.cs:line 34
return response;
}
private Response CallWithRetries(Method method, string uriString, string requestContent, WebClientHeaders headers, int retryCount)
{
var lastException = new WebException();
for (var retriesLeft = retryCount; retriesLeft > 0; --retriesLeft)
{
try
{
var webRequest = CreateRequest(method, uriString, requestContent, headers);
var response = ReceiveResponse(webRequest);
return response;
}
catch (WebException e)
{
lastException = e;
}
Thread.Sleep(RetryBackoffPeriod);
}
throw new WebException($"Failed after {retryCount} retries", lastException);
}
private Response ReceiveResponse(WebRequest webRequest)
{
var json = "no json returned :-(";
var webResponse = GetResponse(webRequest); //at WebApiClient.ReceiveResponse(WebRequest webRequest) in WebApiClient.cs:line 97
if (webResponse == null) return null;
using (webResponse)
{
var responseStream = webResponse.GetResponseStream();
if (responseStream != null)
{
using (var y = new StreamReader(responseStream))
{
json = y.ReadToEnd();
}
}
return new Response(((HttpWebResponse)webResponse).StatusCode, json);
}
}
PS Этот тестовый пример хорошо работает в Windows. Также с Linux-машины я могу запустить свое веб-приложение и выполнить все операции, так что я думаю, что это просто WebRequest.GetResponse()
который бросает исключение.