繁体   English   中英

MaxRequestSize 属性不会停止请求 aspnet dotnet core 3

[英]MaxRequestSize attribute not stopping request aspnet dotnet core 3

我创建了一个示例项目,我想在其中调用带有文件的post请求,在我的实时版本中,这是用户上传文件的操作,但在我的示例中,我只返回Created的结果。

当我添加属性RequestSizeLimit并在我的网站上运行此代码时,未上传超过 100MB 的文件并且对此请求的调用失败。 但是,如果我使用 TestServerFixture 运行项目(因为我正在运行它进行集成测试),那么该方法不会失败?

我已将正常和测试项目的代码附加到此问题,因此您可以下载、恢复包并运行测试。

点击这里下载文件

正如您将看到的,名为“should_return_bad_request_when_file_over_100_mb”的测试失败了。

这是代码的基础知识。

api 站点中的 FileController

using Microsoft.AspNetCore.Http.Extensions;
using Microsoft.AspNetCore.Mvc;

namespace UploadAFile.Controllers
{
    [ApiController]
    [Route("[controller]")]
    public class FileController : ControllerBase
    {
        [HttpPost("upload")]
        [RequestSizeLimit(105906176)] // 101 MB
        public IActionResult PostFile()
        {
            return Created(Request.GetDisplayUrl(), "Yes it worked!");
        }
    }
}

测试方法

using System.Net.Http;
using Xunit;

namespace Tests
{
    public class TestFileController
    {
        [Fact]
        public async void should_return_success_when_file_1_kb()
        {
            var fixture = new TestServerFixture();

            // get a file to upload
            var bytes = new byte[1024]; // 1 KB
            HttpContent bytesContent = new ByteArrayContent(bytes);

            // act
            var client = fixture.CreateClient();
            var formData = new MultipartFormDataContent();
            formData.Add(bytesContent, "bigfile.txt", "bigfile.txt");
            var response = await client.PostAsync("file/upload", formData);

            // assert
            Assert.Equal(System.Net.HttpStatusCode.Created, response.StatusCode);
        }

        [Fact]
        public async void should_return_bad_request_when_file_over_100_mb()
        {
            var fixture = new TestServerFixture();

            // get a file to upload
            var bytes = new byte[106954752]; // 102 MB
            HttpContent bytesContent = new ByteArrayContent(bytes);

            // act
            var client = fixture.CreateClient();
            var formData = new MultipartFormDataContent();
            formData.Add(bytesContent, "bigfile.txt", "bigfile.txt");
            var response = await client.PostAsync("file/upload", formData);

            // assert
            Assert.Equal(System.Net.HttpStatusCode.BadRequest, response.StatusCode);
        }
    }
}

以下是我的测试项目中的参考资料

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>

    <IsPackable>false</IsPackable>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.3.0" />
    <PackageReference Include="Microsoft.AspNetCore.Mvc.Testing" Version="3.0.0" />
    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.2.0" />
    <PackageReference Include="xunit" Version="2.4.1" />
    <PackageReference Include="xunit.runner.visualstudio" Version="2.4.1" />
    <PackageReference Include="coverlet.collector" Version="1.0.1" />
  </ItemGroup>

  <ItemGroup>
    <ProjectReference Include="..\UploadAFile\UploadAFile.csproj" />
  </ItemGroup>

</Project>

有谁知道为什么第二个测试没有失败? 任何帮助将非常感激。

测试服务器不支持 RequestSizeLimit 是设计使然。

通过运行测试项目,您可以看到以下日志:

Microsoft.AspNetCore.Mvc.Filters.RequestSizeLimitFilter:警告:无法应用请求正文大小限制。 此服务器不支持 IHttpRequestBodySizeFeature。

更新:

添加以下代码,即可看到日志:

var builder = new WebHostBuilder()
            .UseContentRoot(System.IO.Directory.GetCurrentDirectory())
            .ConfigureLogging(config =>
            {
                config.SetMinimumLevel(LogLevel.Debug);
                config.AddConsole();
                config.AddDebug();
            })
            .UseTestServer()
            .UseStartup<Startup>();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM