asp.net 核心 5.0 RequestSizeLimit 不工作

asp.net core 5.0 RequestSizeLimit not working

我正在使用 ASP.net 核心 5.0,但似乎 RequestSizeLimit 不工作。

我有以下控制器

[HttpPost("addfile")]
[RequestSizeLimit(5_242_880)] // 5MB
public IActionResult AddFile([FromBody] IFormFile file)

现在当我想测试所述控制器时,我创建了一个 IFormFile 这样的:

public static Mock<IFormFile> TestFile(string filename, string content)
{
    var fileMock = new Mock<IFormFile>();

    var ms = new MemoryStream();
    var writer = new StreamWriter(ms);
    writer.Write(content);
    writer.Flush();
    ms.Position = 0;
    fileMock.Setup(_ => _.OpenReadStream()).Returns(ms);
    fileMock.Setup(_ => _.FileName).Returns(filename);
    fileMock.Setup(_ => _.Length).Returns(ms.Length);

    return fileMock;
}

在我的测试中,我现在添加了 50MB 的内容,如下所示:

var bigContent = RandomString(50 * 1024 * 1024);
var testFile = TestFile("calendar.ical", bigContent);
...
var result = controller.AddFile(testFile.Object);

信息:RandomString returns 给定长度的字符串(不是最优化的方式):

public static string RandomString(int length)
{
    StringBuilder builder = new StringBuilder();
    Random random = new Random();
    char ch;
    for (int i = 0; i < length; i++)
    {
        ch = Convert.ToChar(Convert.ToInt32(Math.Floor(26 * random.NextDouble() + 65)));
        builder.Append(ch);
    }
    return builder.ToString();
}

我希望状态代码不是 200 - 好的。 我做错了什么吗?

您正在对控制器进行单元测试 - 不幸的是,[RequestSizeLimit] 属性在请求管道中作为过滤器实现 - 并且过滤器不是 运行 作为单元测试的一部分。

这是描述in the docs

Set up unit tests of controller actions to focus on the controller's behavior. A controller unit test avoids scenarios such as filters, routing, and model binding. Tests that cover the interactions among components that collectively respond to a request are handled by integration tests. For more information on integration tests, see Integration tests in ASP.NET Core.

可以找到有关集成测试的更多信息here