我有一些api操作,我在OnMethodBoundaryAspect中包含了一个方面, 我对请求中发送的令牌进行验证,如下所示。
[Serializable]
[MulticastAttributeUsage(MulticastTargets.Method, TargetMemberAttributes = MulticastAttributes.Instance)]
public class TokenCallHandler : OnMethodBoundaryAspect
{
/// <summary>
/// Methodo responsável por validar o token enviado pelo usuário
/// </summary>
/// <param name="args"></param>
public override void OnEntry(MethodExecutionArgs args)
{
ApiController apiController = (ApiController)args.Instance;
var context = apiController.ControllerContext;
HttpRequestHeaders headers = context.Request.Headers;
bool validToken = false;
if (headers.Contains("X-Authorization"))
{
var authorization = headers.GetValues("X-Authorization");
var token = authorization.ToList().FirstOrDefault();
if (token == null)
token = "invalid";
validToken = TokenUtil.ValidateToken(token);
}
if (!validToken)
args.ReturnValue = new UnauthorizedAccessException();
}
}
但它继续执行api中的方法,我只想返回401异常。
如果我确实抛出了新的UnauthorizedException,它返回500(内部服务器错误)未经授权的内部,但我需要401.
如何在wep.api动作中捕获返回的方面?
答案 0 :(得分:0)
如ASP.NET Web API : Correct way to return a 401/unauthorised response所述,
您应该从API方法中抛出
HttpResponseException
通过设置args.ReturnValue
,您将更改由您的方面增强的方法的返回值,但您应该抛出异常。
所以最后一行应该是
throw new HttpResponseException(HttpStatusCode.Unauthorized);
或者,如果您想提供自定义消息:
var msg = new HttpResponseMessage(HttpStatusCode.Unauthorized) { ReasonPhrase = "Oops!!!" }; throw new HttpResponseException(msg);
您也可以考虑使用MethodInterceptionAspect
(http://doc.postsharp.net/method-interception),因为您没有包装方法执行,但是您正在拦截它。