按请求错误处理策略

时间:2018-04-18 17:22:57

标签: c# asp.net-web-api2 owin delegatinghandler

我尝试按照this 2013 guide设置每个请求的错误处理政策。

  • 如果请求是本地请求,请显示错误信息。
  • 如果当前用户在IT组中,则显示错误信息。
  • 对于其他人,请不要显示错误。

我的代码:

jmap -dump:format=b,file=<fileName> <java PID>

它已注册为第一个处理程序:

public class PerRequestErrorPolicyDelegatingHandler : DelegatingHandler
{
    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        request.Properties[HttpPropertyKeys.IncludeErrorDetailKey] = new Lazy<bool>(() =>
        {
            // CHECK USER
            var identity = request.GetRequestContext().Principal as ClaimsPrincipal;
            return identity != null && identity.Identity.IsAuthenticated && identity.IsInRole("IT");
        });

        return base.SendAsync(request, cancellationToken);
    }
}

My Web Api托管在Owin上,但我看不到相关的Owin代码,所以我省略了它。为了测试,我使用了这个控制器:

public static void Configure(HttpConfiguration http)
{
    http.MessageHandlers.Add(new PerRequestErrorPolicyDelegatingHandler());
    ...
}

在本地,我总是得到错误信息,并且从不执​​行延迟加载代码(由&#34; CHECK USER&#34;表示),因此我无法弄清楚如何调试它。

部署到服务器,经过身份验证或不经过身份验证,我从未收到任何错误信息。

我的web.config中没有自定义错误配置。

我做错了什么?

1 个答案:

答案 0 :(得分:0)

我认为我所遵循的指南太旧了,不再具有相关性,而是采用了这种方法。它更简单,也很有效。

我们用新的ExceptionResult替换public class PerUserErrorDetailExceptionHandler : ExceptionHandler { public override void Handle(ExceptionHandlerContext context) { var exResult = context.Result as ExceptionResult; if (!context.CatchBlock.IsTopLevel || exResult == null) return; var identity = context.RequestContext.Principal as ClaimsPrincipal; var showErrorDetail = identity != null && identity.Identity.IsAuthenticated && identity.IsInRole("IT"); context.Result = new ExceptionResult( exResult.Exception, showErrorDetail, exResult.ContentNegotiator, exResult.Request, exResult.Formatters); } } ,我们指定是否应该包含详细信息。我们从现有结果中复制其他依赖项。

public static void Configure(HttpConfiguration http)
{
    http.Services.Replace(typeof(IExceptionHandler), new PerUserErrorDetailExceptionHandler());
}

在其他地方,在Web Api配置中:

mvn clean compile -DmemoryInMB=2000 -Dcores=4 -DtimeInMinutesPerClass=10 evosuite:generate test