Должен.ThrowAsync не перехватывать исключение из запроса HttpClient.GetAsync()C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Должен.ThrowAsync не перехватывать исключение из запроса HttpClient.GetAsync()

Сообщение Anonymous »

В нашем проекте у нас есть тест, написанный бывшим коллегой, который запускает запрос к конечной точке, который должен - и возвращает - возвращать 500 - InternalServerError (проверяя это с помощью Followly) после создания исключения. p>
Приведенный ниже код упрощен для демонстрационных целей.
Конечная точка:

Код: Выделить всё

[HttpGet]
[Route("machines/{idMachine:guid}/admin")]
[Authorize(Policy = Policies.RequireMachineCustomerCheck)]
public IActionResult MachineEditor(Guid idMachine)
{
// Lookup machine...

if (machine == null)
{
throw new Exception("Exception");
}
}
Тест:

Код: Выделить всё

[Fact]
public async Task MachineNotFoundShouldThrowException()
{
var idMachine = Guid.NewGuid();
var uri = new Uri($"/machines/{idMachine}/admin", UriKind.Relative);
var httpClient = new HttpClient();

var response = await httpClient.GetAsync(uri);
response.StatusCode.ShouldBe(HttpStatusCode.InternalServerError);
}
Однако после обновления с .NET Core 3.1 до .NET 6 наш конвейер развертывания YAML Azure DevOps сообщает об исключении при запуске теста. Однако он выдается из другого пути кода, в политике авторизации, которая есть в конечной точке:

Во время выполнения запроса произошло необработанное исключение. .
System.Exception: в кэше в памяти сервера не удалось найти компьютер с идентификатором компьютера
7f6825f9-3e4c-4d32-aace-ec9128394e0c. Либо кэш устарел
, либо идентификатор неверен.
в Proseal.Portal.Services.Utilities.CacheHelper.GetProVisionMachine(Guid
idMachine) в
D: \a\1\s\Proseal\Portal.Services\Utilities\CacheHelper.cs:строка 72
в Proseal.Portal.Server.Common.Authorisation.MachineCustomerCheckHandler.HandleRequirementAsync(AuthorizationHandlerContext
контекст, требование MachineCustomerCheck) в
D:\a\1\s\Proseal\Portal.Server\Common\Authorisation\MachineCustomerCheck.cs:line
83
в Microsoft.AspNetCore.Authorization.AuthorizationHandler

Код: Выделить всё

1.HandleAsync(AuthorizationHandlerContext context) at Microsoft.AspNetCore.Authorization.DefaultAuthorizationService.AuthorizeAsync(ClaimsPrincipal user, Object resource, IEnumerable
1 требование)
в Microsoft.AspNetCore.Authorization.Policy.PolicyEvaluator.AuthorizeAsync(AuthorizationPolicy
policy, AuthenticateResult аутентификацияResult, контекст HttpContext,
ресурс объекта)
в Microsoft .AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext
контекст)
в Proseal.Portal.Server.Common.Middleware.AuthenticationForStaticFilesMiddleware.InvokeAsync(HttpContext
контекст, RequestDelegate следующий) в
D:\a\1\s\Proseal\Portal.Server\Common\Middleware\AuthenticationForStaticFilesMiddleware.cs:line
43
at Microsoft.AspNetCore.Builder.UseMiddlewareExtensions.c__DisplayClass6_1.d .MoveNext()

Регистрация политики аутентификации:

Код: Выделить всё

public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthorization(options =>
{
options.AddPolicy(Policies.RequireMachineCustomerCheck, policy => policy.Requirements.Add(new MachineCustomerCheck()));
}
}
}
AuthHandler:

Код: Выделить всё

public class MachineCustomerCheckHandler : AuthorizationHandler
{
protected override Task HandleRequirementAsync()
{
// Lookup machine

if (machine == null)
{
throw new Exception("Exception");
}
}
Локальный запуск теста в обозревателе тестов Visual Studio 2022 не вызывает исключения и не приводит к сбою, но его отладка подтверждает, что исключение создано. Поскольку в результате этого было возвращено 500, тест все еще проходит. Не знаю, почему конвейер развертывания ведет себя иначе, чем VS.
Моей первой мыслью было обернуть тест в try-catch, но исключение не перехватывается.

Код: Выделить всё

try
{
var response = await httpClient.GetAsync(uri);
response.StatusCode.ShouldBe(HttpStatusCode.InternalServerError);
}
catch (Exception exception)
{
exception.Message.ShouldBe("Exception");
}
После некоторого поиска в Google я изменил это, но поведение получилось такое же.

Код: Выделить всё

try
{
await Task.Run(async () => await httpClient.GetAsync(uri));
}
catch (Exception exception)
{
exception.Message.ShouldBe("Exception");
}
Я также пробовал использовать метод MustThrowAsync компании Mustly: https://docs.shouldly.org/documentation ... throwasync, но это также не смогло перехватить исключение.< /p>

Код: Выделить всё

Func func = async () => await httpClient.GetAsync(uri);

await Should.ThrowAsync(func);
Обеспокоен тем, что может возникнуть еще одна проблема с асинхронным кодом (и, следовательно, исключением), содержащимся в отдельном потоке, но мои знания асинхронности не самые лучшие, и поэтому я не хватает других вещей, которые стоит попробовать.


Подробнее здесь: https://stackoverflow.com/questions/784 ... nc-request
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Зачем перехватывать исключения в Java, если можно перехватывать Throwables?
    Anonymous » » в форуме JAVA
    0 Ответы
    25 Просмотры
    Последнее сообщение Anonymous
  • HttpClient.GetAsync выдает слишком большой объект запроса 413
    Гость » » в форуме C#
    0 Ответы
    54 Просмотры
    Последнее сообщение Гость
  • Лучший способ пройти список в строке запроса httpclient.getasync ()
    Anonymous » » в форуме C#
    0 Ответы
    1 Просмотры
    Последнее сообщение Anonymous
  • Вызов httpClient GetAsync завершается неудачно для Https с внутренней ошибкой OpenSSL: ошибка счетчика ссылок
    Anonymous » » в форуме Linux
    0 Ответы
    40 Просмотры
    Последнее сообщение Anonymous
  • HttpClient.GetAsync не работает для определенного URL-адреса
    Anonymous » » в форуме C#
    0 Ответы
    10 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C#»