Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.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# 禁用API请求的StatusCodePages中间件_C#_Asp.net Core - Fatal编程技术网

C# 禁用API请求的StatusCodePages中间件

C# 禁用API请求的StatusCodePages中间件,c#,asp.net-core,C#,Asp.net Core,我正在使用asp.NETCore2.1,它是 似乎呈现了API中间件禁用处理程序的假设,但它没有。是否有一种更干净的方法可以只为MVC请求启用中间件,而不调用app.UseWhen并检查路径字符串,或者这是最好的方法 app.UseWhen( context => !context.Request.Path.Value.StartsWith("/api", StringComparison.OrdinalIgnoreCase), builder => builder.

我正在使用asp.NETCore2.1,它是

似乎呈现了API中间件禁用处理程序的假设,但它没有。是否有一种更干净的方法可以只为MVC请求启用中间件,而不调用
app.UseWhen
并检查路径字符串,或者这是最好的方法

app.UseWhen(
    context => !context.Request.Path.Value.StartsWith("/api", StringComparison.OrdinalIgnoreCase),
    builder => builder.UseStatusCodePagesWithReExecute("/.../{0}"));

这在某种程度上取决于解释,但我想说的是,评论只是暗示可能有什么东西禁用了该功能,而不是默认情况下实际上有什么东西禁用了该功能

我不认为有任何明显更干净的东西-你所拥有的是有意义的,但另一个选择是使用一个自定义中间件来关闭该功能。下面是可能的情况:

public void Configure(IApplicationBuilder app)
{
    // ...
    app.UseStatusCodePagesWithReExecute("/.../{0}");

    app.Use(async (ctx, next) =>
    {
        if (ctx.Request.Path.Value.StartsWith("/api", StringComparison.OrdinalIgnoreCase))
        {
            var statusCodeFeature = ctx.Features.Get<IStatusCodePagesFeature>();

            if (statusCodeFeature != null && statusCodeFeature.Enabled)
                statusCodeFeature.Enabled = false;
        }

        await next();
    });

    // ...
    app.UseMvc();
    // ...
}
public void配置(IApplicationBuilder应用程序)
{
// ...
app.UseStatusCodePagesWithReExecute(“/…/{0}”);
应用程序使用(异步(ctx,下一步)=>
{
if(ctx.Request.Path.Value.StartsWith(“/api”,StringComparison.OrdinalIgnoreCase))
{
var statusCodeFeature=ctx.Features.Get();
如果(statusCodeFeature!=null&&statusCodeFeature.Enabled)
statusCodeFeature.Enabled=false;
}
等待下一个();
});
// ...
app.UseMvc();
// ...
}

我的正确答案是在Startup.cs中使用plain
useStatusCodePagesWithreeExecute
,但在错误控制器中改变处理方式。这允许我返回API错误的纯文本内容,但为用户保留友好的视图

Startup.cs

app.UseStatusCodePagesWithReExecute("/error/{0}");
错误控制器:

[HttpGet("error/{statusCode:int}")]
public IActionResult Error(int statusCode)
{
    var statusCodeFeature = HttpContext.Features.Get<IStatusCodeReExecuteFeature>();

    var exceptionDataFeature = HttpContext.Features.Get<IExceptionHandlerPathFeature>();

    // ... Other logging and stuff

    IActionResult actionResult;

    if (statusCodeFeature == null || statusCodeFeature.OriginalPath.StartsWith("/api", StringComparison.InvariantCultureIgnoreCase))
    {
        actionResult = Content($"The request could not be processed: {statusCode.ToString(CultureInfo.InvariantCulture)}");
    }
    else
    {
        ViewBag.StatusCode = statusCode;

        actionResult = View();
    }

    return actionResult;
}
[HttpGet(“error/{statusCode:int}”)]
公共IActionResult错误(int状态代码)
{
var statuscodeffeature=HttpContext.Features.Get();
var exceptionDataFeature=HttpContext.Features.Get();
//…其他日志记录之类的
IActionResult行动结果;
if(statusCodeFeature==null | | statusCodeFeature.OriginalPath.StartsWith(“/api”,StringComparison.InvariantCultureIgnoreCase))
{
actionResult=Content($”无法处理请求:{statusCode.ToString(CultureInfo.InvariantCulture)});
}
其他的
{
ViewBag.StatusCode=状态代码;
actionResult=View();
}
返回操作结果;
}
[HttpGet("error/{statusCode:int}")]
public IActionResult Error(int statusCode)
{
    var statusCodeFeature = HttpContext.Features.Get<IStatusCodeReExecuteFeature>();

    var exceptionDataFeature = HttpContext.Features.Get<IExceptionHandlerPathFeature>();

    // ... Other logging and stuff

    IActionResult actionResult;

    if (statusCodeFeature == null || statusCodeFeature.OriginalPath.StartsWith("/api", StringComparison.InvariantCultureIgnoreCase))
    {
        actionResult = Content($"The request could not be processed: {statusCode.ToString(CultureInfo.InvariantCulture)}");
    }
    else
    {
        ViewBag.StatusCode = statusCode;

        actionResult = View();
    }

    return actionResult;
}