我看到MVC.NET的第2版现在有一个RequireHttps属性,这对我很有用。然而,什么是关闭效果的好策略?例如,我想在某些页面上使用Https,但在其他页面上使用常规Http。我应该创建自己的RequireHttp属性吗?
编辑:我正在使用自己的RequireHttp属性,它工作正常,但我想知道MVC.NET版本2中是否存在一些我缺少的内置功能。</ p> 编辑2:我一定不清楚。我的问题涉及以下内容:如果您使用RequireHttps,那么之后的任何请求都将超过Https,即使Controller或Action未使用RequireHttps进行修饰。除非我弄错了,否则你需要第二个属性,比如RequireHttp,才能将请求重定向到Http而不是Https。答案 0 :(得分:6)
ActionFilterAttribute
的要点是您可以将它们应用于您想要的任何操作。或者换句话说,您不必将它们应用于所有操作。
如果您不希望将属性的逻辑注入到操作中,则只需将该属性应用于该操作即可。例如:
public class SomeController : Controller {
[RequireHttps]
public ActionResult SomeAction() {
//the attribute's logic will be injected to this action.
return View();
}
public ActionResult SomeOtherAction() {
//this action doesn't require https protocol
return View();
}
}
如果您将该属性应用于控制器本身,则它将应用于控制器中的所有操作。
修改:
要求http协议而不是https,我想你可以使用下面的属性。 我会仔细检查MVC 2是否已经有了这个。但如果它没有(它没有):
public class RequireHttp : ActionFilterAttribute {
public override void OnActionExecuting(ActionExecutingContext filterContext) {
if (filterContext.HttpContext.Request.IsSecureConnection) {
UriBuilder builder = new UriBuilder() {
Scheme = "http",
Host = filterContext.HttpContext.Request.Url.Host,
Path = filterContext.HttpContext.Request.RawUrl
};
filterContext.Result = new RedirectResult(builder.ToString());
filterContext.Result.ExecuteResult(filterContext);
}
base.OnActionExecuting(filterContext);
}
}
答案 1 :(得分:1)
您可以在控制器上应用该属性,在这种情况下,它将应用于所有操作,或仅适用于所选操作。
//apply to all actions
[RequireHttps]
public class SomeController
{
//apply to this action only
[RequireHttps]
public ActionResult SomeAction()
{
}
}
答案 2 :(得分:1)
它对我有用!
我将çağdaş答案转换为 Visual Basic :
Public Class RequireHttpAttribute
Inherits ActionFilterAttribute
Public Overrides Sub OnActionExecuting(ByVal filterContext As _
ActionExecutingContext)
If (filterContext.HttpContext.Request.IsSecureConnection) Then
Dim builder As UriBuilder = New UriBuilder()
builder.Scheme = "http"
builder.Host = filterContext.HttpContext.Request.Url.Host
builder.Path = filterContext.HttpContext.Request.RawUrl
filterContext.Result = New RedirectResult(builder.ToString())
filterContext.Result.ExecuteResult(filterContext)
End If
MyBase.OnActionExecuting(filterContext)
End Sub
End Class
我这样用:
<RequireHttp()> _
Public Class SomeController
<RequireHttp()> _
Function SomeAction(...) As ActionResult
...
End Function
End Class
我也在使用这里描述的Joel Mueller的 RemoteRequireHttps :
ASP.NET MVC RequireHttps in Production Only
答案 3 :(得分:0)
[RequireHttps] //apply to all actions in controller
public class SomeController
{
//... or ...
[RequireHttps] //apply to this action only
public ActionResult SomeAction()
{
}
}
在控制器级别应用它也会将其应用于所有操作方法,否则将其应用于每个单独的Action方法。