【问题标题】:Method continues executing after return statement方法在返回语句后继续执行
【发布时间】:2011-09-07 20:28:09
【问题描述】:

我目前正在尝试解决我编写的 IIS url 重写提供程序中的一个奇怪错误。我有一个 if ... else 在每个块内都有一个 return 语句。发生的情况是第一个块 (if) 被命中并正常执行,返回被命中但随后该方法不返回并继续进入 else 块。这是有问题的代码:

public string Rewrite(string value)
{
    string v = value;
    if (v.Contains(".aspx") || v.Contains("buzz") || v.Contains("promo")) {
        return v;
    } else {
        string val = "";
        using (DataContext db = new DataContext(cs)) {
            var lp = db.LandingPages.FirstOrDefault(l => l.L_Url == v);
            if (lp != null) val = "landing_page.aspx?id=" + lp.L_ID;
        }
        return CoalesceStrings(val, v);
    } 
}

(我知道很多事情可以做得更好,像 v = 值这样的东西是出于调试目的 - 当它正常工作时会改进它!)

有什么想法吗?这似乎不是此方法的正确行为。我在 IIS 7.5 中使用附加到 Windows 7 x64 机器上的 VS2010 进程对其进行调试。

编辑添加:iis 中的匹配模式是 ^(?!(common|ajax|Scripts|uploads|xml))(\w|\d|-|.|[?&=/])+

【问题讨论】:

    标签: c# iis url url-rewriting return


    【解决方案1】:

    我猜您会因为运行不同的线程而看到奇怪的调试行为。你确定这是在 else 块中结束的同一个请求吗? IIS 将同时处理多个请求,其中一些用于图像、脚本、css 等。不仅仅是页面本身。如果在方法中设置两个断点,一个在第一个 return 上,另一个在 else 内,很有可能在从 return 语句中离开方法后,进程再次阻塞对内部不同资源的请求else 语句。

    在调试时密切注意正在使用“线程”窗口调试的线程。还要注意传入的值,它可能会有所不同。

    【讨论】:

    • 值是一样的,我按f10单步执行。正则表达式应避免任何非代码文件。当我设置断点并按刷新时,bp 只被击中一次 - 这会让我相信它的相同请求?
    • @Tom Broad - 什么价值正在通过和评估?
    • 在这种情况下 value = "buzz/some-url"
    猜你喜欢
    • 1970-01-01
    • 2018-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多