在控制器操作之前调用WebAPI函数

时间:2013-08-21 16:40:05

标签: c# asp.net rest asp.net-web-api

我正在使用Microsoft ASP.NET Web API开发RESTful服务。

我需要的是拥有某种处理函数,在我的流程进入控制器方法之前,每次调用服务时都会触发该函数。

假设我可以调用我的数据库并检查是否在请求标头中提供了散列令牌是否有权通过API检索数据,然后,如果有,则继续使用控制器方法。

在WebAPI中是否有我需要的可编程位置?我对Web API数据流不是很熟悉。

2 个答案:

答案 0 :(得分:1)

  

我需要的是拥有某种处理函数,即   在我的流程进入之前,每次调用服务时都会触发   进入控制器方法。

你可以写一个custom message handler。例如,如MSDN文章中所示:

public class ApiKeyHandler : DelegatingHandler
{
    public string Key { get; set; }

    public ApiKeyHandler(string key)
    {
        this.Key = key;
    }

    protected override Task<HttpResponseMessage> SendAsync(
        HttpRequestMessage request, CancellationToken cancellationToken)
    {
        if (!ValidateKey(request))
        {
            var response = new HttpResponseMessage(HttpStatusCode.Forbidden);
            var tsc = new TaskCompletionSource<HttpResponseMessage>();
            tsc.SetResult(response);    
            return tsc.Task;
        }
        return base.SendAsync(request, cancellationToken);
    }

    private bool ValidateKey(HttpRequestMessage message)
    {
        var query = message.RequestUri.ParseQueryString();
        string key = query["key"];
        return (key == Key);
    }
}

答案 1 :(得分:0)

另一种方法是创建自己的实现IDispatchMessageInspector

的类

More Info Here

如果请求对象中没有标题,我会将您的授权检查添加到afterRecieveRequest并抛出异常(可能是http 403)。