我有一些MVC2网站有很多[RequireHttps]
。
但是当我调试它时,我必须在不同的地方(控制器)评论它们中的许多。代码准备好后,我必须删除所有注释。
所以需要时间,有时我忘记取消注释[RequireHttps]
:)
我的问题是解决此问题的最佳做法是什么?
谢谢!
答案 0 :(得分:9)
如果您不想在每次使用时键入#if
语句,您可以在调试版本中创建一个无操作的新属性,并在发布版本中创建一个简单的RequireHttps
子类:
#if DEBUG
public class ReleaseRequireHttpsAttribute : Attribute
{
// no-op
}
#elif
public class ReleaseRequireHttpsAttribute : RequireHttpsAttribute
{
// does the same thing as RequireHttpsAttribute
}
#endif
然后只需使用[RequireHttps]
查找并替换每个[ReleaseRequireHttps]
,并将其用于新方法。
答案 1 :(得分:4)
由于您询问了解决此问题的“最佳做法”,因此本案例中的最佳做法是保留属性并调试与您部署的完全相同的代码。任何其他答案(所有这些都有效)将意味着您正在调试代码,然后在部署之前更改代码,这绝不是一个好主意。
在这种情况下,如果您使用IIS Express,则可以通过SSL调试Web项目。这是Visual Studio 2010 Web服务器的直接替代品,但具有IIS的大多数功能,包括安全的HTTP支持。更多信息可以在这里找到:
http://learn.iis.net/page.aspx/901/iis-express-faq/
安装完成后,您可以切换项目以使用IIS Express,在IIS Express配置中设置https绑定,并照常执行。
答案 2 :(得分:3)
答案 3 :(得分:2)
以下内容将允许您 DRY 启用该功能,并防止必须使用预处理器指令污染您的控制器:
public class CustomRequireHttpsAttribute : RequireHttpsAttribute
{
/* override appropriate method with preprocessor directives */
}
[CustomRequireHttps]
public ActionResult Foo(string foo) { /* ... */ }
[CustomRequireHttps]
public ActionResult Bar(string bar) { /* ... */ }
答案 4 :(得分:1)
使用#if RELEASE ... #endif
结构:
#if RELEASE
[RequireHttps]
#endif
void YourMethod()
{
...
}
答案 5 :(得分:0)
这是自定义属性的工作版本,需要HTTPS连接,除非在Visual Studio调试器下运行:
/// <summary>
/// Requires HTTPS connection unless running under Visual Studio debugger.
/// </summary>
public class RemoteRequireHttpsAttribute : RequireHttpsAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
if (filterContext != null
&& filterContext.HttpContext != null
&& filterContext.HttpContext.Request.IsLocal)
return;
base.OnAuthorization(filterContext);
}
}