我有一些 MVC2 网站,其中有很多[RequireHttps]
.
但是当我调试它时,我必须在不同的地方(控制器)评论它们中的许多。当代码准备好时,我必须删除所有评论。
所以这需要时间,有时我忘了取消评论[RequireHttps]
:)
我的问题是解决这个问题的最佳实践是什么?
谢谢!
我有一些 MVC2 网站,其中有很多[RequireHttps]
.
但是当我调试它时,我必须在不同的地方(控制器)评论它们中的许多。当代码准备好时,我必须删除所有评论。
所以这需要时间,有时我忘了取消评论[RequireHttps]
:)
我的问题是解决这个问题的最佳实践是什么?
谢谢!
如果您不想#if
围绕每个用法键入语句,您可以创建一个新属性,该属性在调试版本中是无操作的,并且是RequireHttps
发布版本中的简单子类:
#if DEBUG
public class ReleaseRequireHttpsAttribute : Attribute
{
// no-op
}
#elif
public class ReleaseRequireHttpsAttribute : RequireHttpsAttribute
{
// does the same thing as RequireHttpsAttribute
}
#endif
然后简单地查找和替换每一个[RequireHttps]
并将[ReleaseRequireHttps]
其用于新方法。
由于您询问了解决此问题的“最佳实践”,因此在这种情况下,最佳实践是保留属性并调试您部署的完全相同的代码。任何其他答案(所有这些都将起作用)将意味着您正在调试代码,然后在部署之前更改代码,这绝不是一个好主意。
在这种情况下,如果您使用 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 绑定,然后正常单步执行。
我会使用#if (C# Reference)并有一个 Debug 和 Release 配置:
那么你:
#if RELEASE
[RequireHttps]
#endif
void methodHere()
{
...
}
以下将允许您干掉功能并防止使用预处理器指令污染控制器的必要性:
public class CustomRequireHttpsAttribute : RequireHttpsAttribute
{
/* override appropriate method with preprocessor directives */
}
[CustomRequireHttps]
public ActionResult Foo(string foo) { /* ... */ }
[CustomRequireHttps]
public ActionResult Bar(string bar) { /* ... */ }
使用#if RELEASE ... #endif
结构:
#if RELEASE
[RequireHttps]
#endif
void YourMethod()
{
...
}
这是自定义属性的工作版本,除非在 Visual Studio 调试器下运行,否则需要 HTTPS 连接:
/// <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);
}
}