如果您在开发工作站上运行发布版本,这将无济于事,但条件编译可以完成这项工作...
#if !DEBUG
[RequireHttps] //apply to all actions in controller
#endif
public class SomeController
{
//... or ...
#if !DEBUG
[RequireHttps] //apply to this action only
#endif
public ActionResult SomeAction()
{
}
}
Update
在 Visual Basic 中,从技术上讲,属性与其所应用的定义属于同一行。您不能将条件编译语句放在一行中,因此您必须编写两次函数声明 - 一次带有属性,一次不带有属性。不过,如果你不介意丑陋的话,它确实有效。
#If Not Debug Then
<RequireHttps()> _
Function SomeAction() As ActionResult
#Else
Function SomeAction() As ActionResult
#End If
...
End Function
Update 2
有几个人提到了源自RequireHttpsAttribute
没有提供示例,所以这是一个适合您的示例。我认为这种方法比条件编译方法干净得多,这将是我在你的立场上的偏好。
免责声明:我还没有测试过这段代码,哪怕是一点点,而且我的 VB 相当生疏。我所知道的是它可以编译。我是根据spot、queen3和Lance Fisher的建议写的。如果它不起作用,它至少应该传达总体想法,并为您提供起点。
Public Class RemoteRequireHttpsAttribute
Inherits System.Web.Mvc.RequireHttpsAttribute
Public Overrides Sub OnAuthorization(ByVal filterContext As _
System.Web.Mvc.AuthorizationContext)
If IsNothing(filterContext) Then
Throw New ArgumentNullException("filterContext")
End If
If Not IsNothing(filterContext.HttpContext) AndAlso _
filterContext.HttpContext.Request.IsLocal Then
Return
End If
MyBase.OnAuthorization(filterContext)
End Sub
End Class
基本上,如果当前请求是本地请求(即,您通过 localhost 访问该站点),新属性就会退出,而不是运行默认的 SSL 授权代码。你可以这样使用它:
<RemoteRequireHttps()> _
Public Class SomeController
<RemoteRequireHttps()> _
Public Function SomeAction() As ActionResult
...
End Function
End Class
干净多了!前提是我未经测试的代码确实有效。