C# 禁用API请求的StatusCodePages中间件
我正在使用asp.NETCore2.1,它是 似乎呈现了API中间件禁用处理程序的假设,但它没有。是否有一种更干净的方法可以只为MVC请求启用中间件,而不调用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.
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中使用plainuseStatusCodePagesWithreeExecute
,但在错误控制器中改变处理方式。这允许我返回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;
}