首页 > 解决方案 > .NET 5 异常引发内容流错误

问题描述

我正在将一个项目升级到 .NET 5.0,而我们的一个异常扩展类在其他人通过的测试中失败了。这只是 .NET 5.0 中的一个问题,它在 .NET Core 3.1 中运行良好。

测试检查的代码中抛出的两个异常的示例:

if (request.GroupId <= 0)
{
    throw new BadRequestException($"A valid {nameof(Data.Models.Group)} Id must be provided.");
}

var group = await Database.Groups.FindAsync(request.GroupId);
if (group == null)
{
    throw new EntityNotFoundException($"{nameof(Data.Models.Group)} not found.");
}

使用上面的代码,在运行测试时,任何BadRequestException通过但任何期望类NotFound响应的测试都会EntityNotFoundException产生以下错误:

Exception Message: 
        Test method MyProject.Test.Tests.Integration.Group.DeleteGroupTests.DeleteGroup_IdDoesNotExist_NotFound threw exception: 
        System.Net.Http.HttpRequestException: Error while copying content to a stream. ---> System.IO.IOException:  ---> MyProject.Data.Exceptions.EntityNotFoundException: Group not found.
      Stack Trace: 
        DeleteGroupCommandHandler.Handle(DeleteGroupCommand request, CancellationToken cancellationToken) line 40
        RequestExceptionProcessorBehavior`2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate`1 next)
...

EntityNotFoundException - 失败

public class EntityNotFoundException : ExceptionBase
{
    private static string DefaultMessageHeader => "Not found";

    public override HttpStatusCode StatusCode => HttpStatusCode.NotFound;

    public EntityNotFoundException(string message, string messageHeader = null)
            : base(message, messageHeader ?? DefaultMessageHeader) { }
}

BadRequestException - 通过

public class BadRequestException : ExceptionBase
{
    private static string DefaultMessageHeader => "Bad Request";

    public override HttpStatusCode StatusCode => HttpStatusCode.BadRequest;

    public BadRequestException(string message, string messageHeader = null)
            : base(message, messageHeader ?? DefaultMessageHeader) { }
}

班级有什么问题EntityNotFoundException?为什么只有那些失败?

更新 1

测试:

// FAILS
[DataTestMethod]
[DataRow(int.MaxValue)]
public async Task DeleteGroup_IdDoesNotExist_NotFound(int groupId)
{
    var response = await Client.DeleteAsync($"/api/groups/{groupId}");
    response.StatusCode.Should().Be(HttpStatusCode.NotFound);
}

// PASSES
[DataTestMethod]
[DataRow(0)]
[DataRow(-1)]
public async Task DeleteGroup_InvalidId_BadRequest(int groupId)
{
    var response = await Client.DeleteAsync($"/api/groups/{groupId}");
    response.StatusCode.Should().Be(HttpStatusCode.BadRequest);
}

标签: c#.net.net-5

解决方案


找到了修复测试的解决方案,但仍然不确定为什么错误只发生在EntityNotFoundException异常类而不发生其他类。

如果有人知道为什么下面的代码修复了失败的测试,我很想听听。

解决方案是指定在HttpCompletionOption.ResponseHeadersRead中不可用的标志DeleteAsync,因此切换到SendAsync

从:

using var response = await Client.DeleteAsync($"/api/groups/{groupId}");

至:

using var response = await Client.SendAsync(new HttpRequestMessage(HttpMethod.Delete, $"/api/groups/{groupId}"), HttpCompletionOption.ResponseHeadersRead);

推荐阅读