Asp.Net Core: HttpRequestException при вызове внешнего API

У меня проблема с выполнением HTTP-вызовов внешнего API с использованием HTTPS (TLS 1.2) из ​​моего веб-приложения .NET Core 1.1. Приложение работает нормально локально, но при развертывании в службах приложений Azure я получаю следующее исключение:

exceptionMessage:An error occurred while sending the request.
exceptionType:System.Net.Http.HttpRequestException

Внутреннее исключение:

innerExceptionMessage:A security error occurred
innerExceptionType:System.Net.Http.WinHttpException

Странно то, что я получаю это исключение не на все запросы к внешнему API, оно случается только несколько раз.

Я заметил, что подобные вопросы обсуждались в других сообщениях SO, но большинство из них касались самозаверяющих сертификатов. В моем случае удаленный сервер использует сертификат, подписанный GeoTrust.

Все звонки совершаются с System.Net.Http.HttpClient

Связанный:

Полная трассировка стека:

{ exceptionType: "System.Net.Http.HttpRequestException", innerException: { innerStacktrace: " at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1.ConfiguredTaskAwaiter.GetResult() at System.Net.Http.WinHttpHandler.<StartRequest>d__105.MoveNext()", innerExceptionMessage: "A security error occurred", innerExceptionType: "System.Net.Http.WinHttpException" }, stacktrace: " at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1.ConfiguredTaskAwaiter.GetResult() at System.Net.Http.HttpClient.<FinishSendAsync>d__58.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Integration.Services.ApiService.<PostResourceToApiAsync>d__5`1.MoveNext() in C:\projects\integration\src\Integration\Services\ApiService.cs:line 112 --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Integration.Services.AccountService.<NotifyOwnerAsync>d__12.MoveNext() in C:\projects\integration\src\Integration\Services\AccountService.cs:line 115 --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Integration.Services.AccountService.<CreateAccountAsync>d__9.MoveNext() in C:\projects\integration\src\Integration\Services\AccountService.cs:line 66 --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Integration.Services.PartnerService.<CreateAccountAsync>d__11.MoveNext() in C:\projects\integration\src\Integration\Services\PartnerService.cs:line 100 --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Integration.Controllers.AccountsController.<Create>d__7.MoveNext() in C:\projects\integration\src\Integration\Controllers\AccountsController.cs:line 92 --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.<InvokeActionMethodAsync>d__27.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.<InvokeNextActionFilterAsync>d__25.MoveNext() --- End of stack trace from previous location where exception was thrown --- at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Rethrow(ActionExecutedContext context) at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted) at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.<InvokeNextExceptionFilterAsync>d__24.MoveNext()", exceptionMessage: "An error occurred while sending the request." }

person peter-bergman    schedule 04.07.2017    source источник
comment
не могли бы вы также получить трассировку стека? Также, если возможно, попробуйте выполнить [трассировку system.net] (docs.microsoft.com/en-us/dotnet/framework/network-programming/)   -  person Rohith    schedule 04.07.2017
comment
Я добавил полную трассировку стека, но трассировка system.net еще не работает.   -  person peter-bergman    schedule 04.07.2017
comment
Следуйте этим инструкциям, чтобы включить трассировку system.net blogs.msdn.microsoft.com/benjaminperkins/2017/01/05/   -  person Rohith    schedule 04.07.2017
comment
Я следовал этому руководству, но в каталог, указанный в свойстве initializeData, нет файла. Возможно, описанный в статье подход неприменим для приложений .NET Core.   -  person peter-bergman    schedule 04.07.2017
comment
Это может быть правильно, я не пробовал использовать основное приложение .net, я проверю его и обновлю эту ветку   -  person Rohith    schedule 04.07.2017


Ответы (1)


Я думаю, что проблема, которую я видел, связана с этой ошибкой: https://github.com/dotnet/corefx/issues/7812

Это объясняет, почему я увидел это только тогда, когда приложение было развернуто в веб-приложении в Azure, поскольку оно работает под управлением Windows Server 2012. Реальным решением этой проблемы было бы обновление до Windows Server 2016, но в настоящее время это не поддерживается для веб-приложений в Лазурный :-(

На данный момент мой обходной путь - это простой механизм повторной попытки, который, кажется, работает довольно хорошо.

person peter-bergman    schedule 11.07.2017