确定 Server.Transfer[Request] 是否被执行

mlh*_*Dev 5 c# asp.net error-handling asp.net-mvc

我正在调试两件事,发现当执行操作时:

Server.TransferRequest(url);
return new EmptyResult();
Run Code Online (Sandbox Code Playgroud)

Application_Error会触发并捕获异常“SessionStateTempDataProvider 类需要启用会话状态”。

(我确实启用了会话状态,特别是 StateServer,为了讨论起见,我们假设我不需要将此请求的更改提交回会话)

我想控制如何记录此场景。显然我可以检测异常类型和消息文本,但如果我不想请求被.TransferRequest“d”(或.Transfer“d”)时进行特殊日志记录,我该怎么做?

我已经检查过了Response.IsRequestBeingRedirected——确实如此false

Ogu*_*gul 3

每个 Server.Transfer 都会向堆栈添加一个不安全的请求完成调用,因此,如果有超过 1 个这样的调用,您可能会认为该请求是由 或Server.Transfer方法Server.TransferRequest之一在内部重定向的

这是一个布尔函数,您可以将其添加到 global.asax 文件中,如果在当前堆栈跟踪中找到多个请求完成帧实例,该函数将返回 true。

new StackTrace()是一个昂贵的操作,但是,因为这是在异常上下文中执行的,所以它的开销“可能”被忽略。

private bool IsRequestTransferred()
{
    System.Diagnostics.StackTrace stackTrace = new System.Diagnostics.StackTrace();
    int requestCompletionCount = 0;
    foreach (var stackFrame in stackTrace.GetFrames())
    {
        System.Reflection.MethodBase methodBase = stackFrame.GetMethod();
        if (methodBase.DeclaringType.Name == "UnsafeIISMethods" && methodBase.Name == "MgdIndicateCompletion")
        {
            if (++requestCompletionCount == 2)
            {
                return true;
            }
        }
    }
    return false;
}

void Application_Error(object sender, EventArgs e)
{
    bool isRequestTransferred = IsRequestTransferred();
}
Run Code Online (Sandbox Code Playgroud)