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