c# - MaxRequestSize 属性不停止请求 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>();
推荐阅读
- ios - 如何使多个右栏按钮项在导航栏中垂直堆叠?
- javascript - FlotChart - 如何为折线图中的特定系列分配颜色?
- excel - 如何使用powershell更改excel CSV保存中的分隔符
- c# - Zebra 扫描仪 8178 onBarcode 读取事件未触发
- angular - 路由激活的任何保护激活
- python - Tensorflow:将导入的图形操作应用于 2d 张量的每个元素
- c# - 我创建的库使用不同版本的依赖项作为我的 MVC 项目
- apache-spark - Filtering Spark Dataset[Row] switch casing Column value
- c# - 当前上下文中不存在名称 Invoicee1
- python - 是否可以使用 pytest 进行 RESTful API 功能测试/一个好习惯?