我尝试按照this 2013 guide设置每个请求的错误处理政策。
我的代码:
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中没有自定义错误配置。
我做错了什么?
答案 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