Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .NET Core TestServer将post请求返回到不存在路径的状态200而不是404_C#_.net_.net Core_Xunit - Fatal编程技术网

C# .NET Core TestServer将post请求返回到不存在路径的状态200而不是404

C# .NET Core TestServer将post请求返回到不存在路径的状态200而不是404,c#,.net,.net-core,xunit,C#,.net,.net Core,Xunit,我正在使用以下指南为.NET Core 3.1应用程序实施集成测试:。这是我当前的测试类: public class IntegrationTests : IClassFixture<WebApplicationFactory<main_app.Startup>> { private readonly WebApplicationFactory<main_app.Startup> _factory; public TestTest(WebAp

我正在使用以下指南为.NET Core 3.1应用程序实施集成测试:。这是我当前的测试类:

public class IntegrationTests : IClassFixture<WebApplicationFactory<main_app.Startup>>
{
    private readonly WebApplicationFactory<main_app.Startup> _factory;

    public TestTest(WebApplicationFactory<main_app.Startup> factory) {
        _factory = factory;
    }

    [Fact]
    public async void GetBogusPath() {
        var client = _factory.CreateClient();
        var response = await client.GetAsync("ofajspd");
        Assert.False(response.IsSuccessStatusCode);
    }

    [Fact]
    public async void PostBogusPath() {
        var client = _factory.CreateClient();
        var request_body = new StringContent("{}", Encoding.UTF8, "application/json");
        var response = await client.PostAsync("ofajspd", request_body);
        Assert.False(response.IsSuccessStatusCode);
    }
}
公共类集成测试:IClassFixture
{
私有只读WebApplicationFactory\u工厂;
公共测试(WebApplicationFactory工厂){
_工厂=工厂;
}
[事实]
公共异步void getbogupath(){
var client=_factory.CreateClient();
var response=await client.GetAsync(“ofajspd”);
Assert.False(response.issucessStatusCode);
}
[事实]
公共异步void PostBogusPath(){
var client=_factory.CreateClient();
var request_body=newstringcontent(“{}”,Encoding.UTF8,“application/json”);
var response=wait client.PostAsync(“ofaaspd”,请求体);
Assert.False(response.issucessStatusCode);
}
}
get请求测试按预期运行,因为它返回404状态代码。但是,post请求返回200状态,即使路径不存在。什么可能导致此问题,如何解决

如果我在本地运行服务器,并在不存在的端点上手动触发post请求,那么它将按预期运行,因此问题仅限于这些集成测试

编辑:以下是我的控制器类定义:

[ApiController]
[ApiVersion("1")]
[Route("v{version:apiVersion}/[controller]")]
public class QueryController : ControllerBase
{
    [AcceptVerbs("Post")]
    public async Task<QueryResponse> Post([FromBody]QueryRequest rq) {
        return await QueryHandler.HandlePost(rq, this.HttpContext);
    }
}
[ApiController]
[第1版]
[路由(“v{version:apivversion}/[controller]”)
公共类查询控制器:ControllerBase
{
[接受动词(“Post”)]
公共异步任务发布([FromBody]QueryRequest rq){
返回wait wait QueryHandler.HandlePost(rq,this.HttpContext);
}
}

问题是我在Startup.cs中附加了一个自定义中间件,它有一个bug,所以它吞下了其他中间件生成的404,而输出了200。它本应处理特定类型的错误,但该错误导致它处理比预期范围更广的错误。删除有故障的中间件修复了该问题


为了获得更多细节,所讨论的自定义中间件正在检查其他中间件层抛出的异常中是否存在特定的“HResult”,但HResult值指的是一个AggregateException,该异常抛出的频率远高于我所查找的特定错误(在响应已经开始流式处理后写入响应).

您的控制器方法和路由是什么样子的?我已将控制器添加到原始问题中。您的startup类中是否有任何内容可能正在向管道中注入响应?您的
Configure
方法是什么样子的?请也分享您的启动配置。感谢@JamieTaylor,原来一些用于捕获特定服务器错误并抑制它的自定义中间件错误地捕获了更广泛的错误,因此返回了200而不是500。它仍然不是我所期望的404,但这解决了我认为问题中提出的问题。如果你想把你的评论作为一个答案,我很乐意赏金给你。