从owin中间件中的当前控制器获取属性

时间:2016-02-18 00:44:40

标签: asp.net-web-api2 owin self-hosting attributerouting

让我有点生气,希望有人可以帮助我。

使用WebAPI我可以做这样的事情

public class AuthenticationMessageHandler : DelegatingHandler
{
    protected override async Task<HttpResponseMessage>SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        try
        {
            var config = GlobalConfiguration.Configuration;
            var controllerSelector = new DefaultHttpControllerSelector(config);
            var descriptor = controllerSelector.SelectController(request);

            var atts = descriptor.GetCustomAttributes<IgnoreValidationAttribute>();

这让我了解了我的属性,我感到高兴和笑容,一切都很好。

但是

使用属性路由,我认为是问题,使用上面的代码或替换

var config = GlobalConfiguration.Configuration;

var config = request.GetConfiguration();

我得到零例外,我不那么开心和笑脸。可是一些很棒的人给我一些指导来解决这个问题,因为我很难过。

提前致谢!

1 个答案:

答案 0 :(得分:0)

这是我在ASP MVC应用程序中的操作方式,因此我认为应该有一种相似的方法来从Web API中的请求访问描述符。

    using System.Web;
    using System.Web.Mvc;

    private bool HasAttribute<T>()
    {
        var skip = false;
        try
        {
            var routeDataList = HttpContext.Current.Request.RequestContext.RouteData.Values.Values.First() as IList<System.Web.Routing.RouteData>;
            var routeData = routeDataList.First() as System.Web.Routing.RouteData;
            var actionDescriptorList = routeData.DataTokens.Values.First() as IList<object>;
            var reflectedActionDescriptor = actionDescriptorList.First() as ReflectedActionDescriptor;
            skip = reflectedActionDescriptor.GetCustomAttributes(typeof(T), false)
                                                .Any();
        }
        catch
        {
            //can't get the attributes; skip should be false
        }
        return skip;
    }