从控制器中删除在配置中设置的属性

时间:2018-08-18 14:21:06

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

如下所示,我为https项目请求了http时,我编写了自定义属性以将请求重定向到Web API

public class RedirectToHttpAttribute: AuthorizeAttribute
    {
        public override void OnAuthorization(HttpActionContext actionContext)
        {
            if (actionContext.Request.RequestUri.Scheme != Uri.UriSchemeHttps)
            {
                var response = actionContext.Request.CreateResponse(System.Net.HttpStatusCode.Found, "");
                var uri = new UriBuilder(actionContext.Request.RequestUri);
                uri.Scheme = Uri.UriSchemeHttps;
                uri.Port = 44326;
                response.Headers.Location = uri.Uri;
                actionContext.Response = response;
            }
        }
    }

现在,我想将此属性设置为所有控制器和操作,因此我在WebApiConfig中添加了此属性。

config.Filters.Add(new RedirectToHttpAttribute());

现在有一个控制器需要同时允许httphttps。为了使之成为可能,我必须从WebApiConfig中删除上述行,并将其添加到所有控制器(问题中的一个除外)。我可以很容易地做到这一点,因为我的控制器很少,但是如果我有很多控制器,那么解决方案将是什么,因为很容易产生错误来装饰每个控制器?

1 个答案:

答案 0 :(得分:1)

您可以通过创建第二个属性并修改现有的重定向过滤器来实现。

类似这样的东西:

"@angular/core": "^6.0.0",
"@angular/forms": "^6.0.0"

然后在您的控制器(或操作)上:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false)]
public class AllowHttpAttribute : Attribute
{
}

public class RedirectToHttpsAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        if (actionContext.ActionDescriptor.GetCustomAttributes<AllowHttpAttribute>(false).Any())
        {
            return;
        }

        // Perform the redirect to HTTPS.
    }
}