C# AuthorizationAsync函数的自定义AuthorizationAttribute

C# AuthorizationAsync函数的自定义AuthorizationAttribute,c#,asp.net,asp.net-web-api,async-await,C#,Asp.net,Asp.net Web Api,Async Await,我正在尝试创建自己的自定义System.Web.Http.AuthorizeAttribute。在我需要在重写的OnAuthorization函数中运行一些async函数之前,一切都正常 我找到了OnAuthorizationAsync方法,并使用了该方法,但是在运行async方法时仍然存在问题。我需要确保附加到HttpActionContext的头在数据库中 public override Task OnAuthorizationAsync(HttpActionContext acti

我正在尝试创建自己的自定义
System.Web.Http.AuthorizeAttribute
。在我需要在重写的
OnAuthorization
函数中运行一些
async
函数之前,一切都正常

我找到了
OnAuthorizationAsync
方法,并使用了该方法,但是在运行
async
方法时仍然存在问题。我需要确保附加到
HttpActionContext
的头在数据库中

    public override Task OnAuthorizationAsync(HttpActionContext actionContext, CancellationToken cancellationToken)
    {
        IEnumerable<string> values;
        if (actionContext.Request.Headers.TryGetValues("Authentication", out values))
        {
            var token = new Token() { TokenString = values.First() };
            if (await _tg.ValidateToken(token))
            {
                return base.OnAuthorizationAsync(actionContext, cancellationToken);
            }
        }

        base.HandleUnauthorizedRequest(actionContext);
    }
AuthorizationAsync(HttpActionContext actionContext,CancellationToken CancellationToken)上的公共重写任务 { i可数值; if(actionContext.Request.Headers.TryGetValues(“身份验证”,输出值)) { var token=new token(){TokenString=values.First()}; 如果(等待_tg.ValidateToken(令牌)) { 返回base.OnAuthorizationAsync(actionContext,cancellationToken); } } base.HandleUnauthorizedRequest(actionContext); }
\u tg.ValidateToken(token)
是一种返回bool的
异步方法。如果我尝试
等待它,并将
OnAuthorizationAsync
作为
异步
方法,那么我显然无法返回任务:

由于OnAuthorizeAsync是一个返回“Task”的
async
方法,因此返回关键字后面不能跟有对象表达式


有没有办法摆脱这种混乱局面?

因为使用了
wait
,所以需要在方法声明中添加
async
修饰符。然后将
返回
更改为
等待
。编译器将完成剩下的工作,即为您返回
任务。

因为您使用
wait
,所以需要在方法声明中添加
async
修饰符。然后将
返回
更改为
等待
。编译器将完成剩下的工作,即为您返回
任务。

基于@sellotape的答案:

public async override Task OnAuthorizationAsync(HttpActionContext actionContext, CancellationToken cancellationToken)
{
    IEnumerable<string> values;
    if (actionContext.Request.Headers.TryGetValues("Authentication", out values))
    {
        var token = new Token() { TokenString = values.First() };
        if (await _tg.ValidateToken(token))
        {
            return base.OnAuthorizationAsync(actionContext, cancellationToken);
        }
    }
    await base.HandleUnauthorizedRequest(actionContext);
}
AuthorizationAsync上的公共异步重写任务(HttpActionContext actionContext,CancellationToken CancellationToken)
{
i可数值;
if(actionContext.Request.Headers.TryGetValues(“身份验证”,输出值))
{
var token=new token(){TokenString=values.First()};
如果(等待_tg.ValidateToken(令牌))
{
返回base.OnAuthorizationAsync(actionContext,cancellationToken);
}
}
wait base.HandleUnauthorizedRequest(actionContext);
}

基于@sellotape的回答:

public async override Task OnAuthorizationAsync(HttpActionContext actionContext, CancellationToken cancellationToken)
{
    IEnumerable<string> values;
    if (actionContext.Request.Headers.TryGetValues("Authentication", out values))
    {
        var token = new Token() { TokenString = values.First() };
        if (await _tg.ValidateToken(token))
        {
            return base.OnAuthorizationAsync(actionContext, cancellationToken);
        }
    }
    await base.HandleUnauthorizedRequest(actionContext);
}
AuthorizationAsync上的公共异步重写任务(HttpActionContext actionContext,CancellationToken CancellationToken)
{
i可数值;
if(actionContext.Request.Headers.TryGetValues(“身份验证”,输出值))
{
var token=new token(){TokenString=values.First()};
如果(等待_tg.ValidateToken(令牌))
{
返回base.OnAuthorizationAsync(actionContext,cancellationToken);
}
}
wait base.HandleUnauthorizedRequest(actionContext);
}

@Nick H,如果该答案适用于you@Nick如果这个答案对你有效,你应该把它标记为有效