public async void OnAuthorization(AuthorizationFilterContext context){
Convert.ToInt32("NotConvertable");
}
try
{
await _next(context);
}
catch (Exception ex)
{
_logger.LogError("FATAL ERROR", ex);
}
但这无济于事,仍然令人崩溃。
我在考虑make try{}catch返回500,并在每个过滤器中进行某种日志记录,但这将导致大量的重复。
有什么办法可以在全球范围内处理吗?
public class PermissionAttribute:TypeFilterAttribute
{
public PermissionAttribute():base(typeof(PermissionFilter))
{
}
}
public class PermissionFilter : IAuthorizationFilter
{
public async void OnAuthorization(AuthorizationFilterContext context)
{
Convert.ToInt32("NotConvertable");
}
}
[Route("api/nav/")]
public class AController : Controller{
...
[HttpGet]
[Route("{id}")]
[PermissionAttribute]
[ProducesResponseType(typeof(SomeClass), 200)]
public async Task<SomeClass> GetAll()
{
...
}
}
... some app.Use UseLogger, HealthCheck
app.UseMiddleware<PleaseDontCrushMiddleware>(); // Middleware mentioned above
app.UseExceptionHandler(errorHandler.Handle);
a lot of middlewares
app.UseMvc(RouteTable);
MVC服务的添加方式如下:
services.AddMvc(config =>
{
var policy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
config.Filters.Add(new AuthorizeFilter(policy));
config.Filters.Add(new ResponseCacheFilter(new CacheProfile()
{
NoStore = true,
Location = ResponseCacheLocation.None
},
services.BuildServiceProvider().GetService<ILoggerFactory()));
}
假设您将在某些方法中抛出一些特定的异常,而另一些方法只想作为System.Exception捕获,也许您可以使用以下方法:
您可以创建异常处理扩展方法(如果您也想使用Logger,只需在方法中添加ILogger参数并从startup.configure传递它):
public static class ExceptionHandler
{
/// <summary>
///
/// </summary>
/// <param name="app"></param>
public static void UseCustomExceptionHandler(this IApplicationBuilder app)
{
app.UseExceptionHandler(eApp =>
{
eApp.Run(async context =>
{
context.Response.StatusCode = 500;
context.Response.ContentType = "application/json";
var errorCtx = context.Features.Get<IExceptionHandlerFeature>();
if (errorCtx != null)
{
var ex = errorCtx.Error;
var message = "Unspecified error ocurred.";
var traceId = traceIdentifierService.TraceId;
if (ex is ValidationException)
{
var validationException = ex as ValidationException;
context.Response.StatusCode = (int)HttpStatusCode.BadRequest;
message = string.Join(" | ", validationException.Errors.Select(v => string.Join(",", v.Value)));
}
else if (ex is SomeCustomException)
{
var someCustomException = ex as SomeCustomException;
...
}
var jsonResponse = JsonConvert.SerializeObject(new ErrorResponse
{
TraceId = traceId,
Message = message
});
await context.Response.WriteAsync(jsonResponse, Encoding.UTF8);
}
});
});
}
}
然后您只需在Startup Configure中注册它:
public void Configure(IApplicationBuilder app)
{
...
app.UseCustomExceptionHandler();
...
}
不要在授权筛选器中引发异常:
The exception will not be handled.
Exception filters will not handle the exception.
考虑在授权筛选器中发生异常时发出质询
您可以在这里阅读更多关于它的信息:https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/filters?view=aspnetcore-3.1#action-filters
为什么全局异常处理不能处理筛选器中引发的异常? 我的代码现在是这样的:
我想在Spring中处理某些异常并将REST响应包装成另一种对象格式。 因此,我想到了使用过滤器并检查响应状态代码的想法,例如,如果是400,则意味着请求不正确,因此我可以将响应包装为所需的JSON格式,下面是代码示例: 将特定异常的响应封装在过滤器中是一种好方法吗?这种情况的缺点是什么?
.NET核心和ASP.NET核心到底有什么区别?
24.2 核心编译的前处理与核心功能选择 什么?核心编译还要进行前处理?没错啦!事实上,核心的目的在管理硬件与提供系统核心功能,因此你必须要先找到你的系统硬件, 并且规划你的主机未来的任务,这样才能够编译出适合你这部主机的核心!所以,整个核心编译的重要工作就是在“挑选你想要的功能”。 下面鸟哥就以自己的一部主机软/硬件环境来说明,解释一下如何处理核心编译啰! 24.2.1 硬件环境检视与核心功能要
我正在使用 ASP.NET 核心 RazorPage 作为 MVC 控制器的替代方案,我希望能够通过 XMLHttpRequest 提交客户端表单。我已经弄清楚了XSRF令牌位,以便通过集合,但是RazorPages框架似乎没有处理入站JSON有效负载并将其绑定到属性。 一些代码: 页面的模型(.cshtml.cs): 和客户端帖子: 我已验证数据是否正确提交: 在提交请求之前,axios会添加X