你能阻止 mvc 库中的方法吗(或者真的在任何 class 上)

Can you block a method in mvc library (or really on any class)

我们有一个使用多个域(与租户)的项目,当我们需要生成绝对 url 时,我们曾经这样做:

var forgotUrl = Url.Action("Forgot", "Account", null, this.Request.Url.Scheme);

效果很好,有时您需要绝对 urls,例如发送带有重置密码链接的电子邮件。


但是,我们现在已经使用反向代理实施了 SSL,这意味着 this.Request.Url.Scheme 不再为我们提供正确的域。

因此我们不得不做这样的事情

var forgotUrl = CurrentHostWithSchemeWithoutTrailingSlash + Url.Action("Forgot", "Account");

为了简化我们做了一个扩展方法,像这样

Url.AbsoluteAction("Forgot", "Account", *data*)

一切都按预期工作,所以一切都很好,但是,您仍然可以通过编写一行调用原始 Url.Action 并发送 this.Request.Url.Scheme.

来搞砸

所以我的问题很简单:有没有什么方法可以阻止使用它,要么隐藏它,要么给出编译器错误、警告等等?

对于方法是 class 成员的一般情况,您真正的选择是查找用法和更新代码。您可以不时使用 "find all usages"(VS 或 VS+R#)手动查找此类功能的所有情况,也可以使用自动化工具。如果您使用 VS 2015+,请参阅 。对于旧版本或构建测试,您可以扫描代码,例如通过添加将加载程序集、解析 IL 和断言错误方法的单元测试。

对于这种特殊情况,因为 Url.Action 是扩展方法 - 附加选项是在另一个默认情况下在视图中可见的静态 class 中创建另一个具有相同签名的扩展方法(例如 namespace System; public static class MyHack{ ...Action(UrlHelper...) 因此编译器将找到该方法的 2 个变体并显示错误。

同时教育开发人员(即在代码审查期间)和可用的现有代码通常就足够了。如果项目中已经存在可以正确执行此操作的示例,那么它很可能只是 copy-pasted.