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

本文关键字:Transfer Request Server 是否 执行 | 更新日期: 2023-09-27 18:24:03

我调试了两件事,发现当执行一个操作时:

Server.TransferRequest(url);
return new EmptyResult();

我的Application_Error将触发并捕获异常"SessionStateTempDataProvider类需要启用会话状态。"

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

我想控制如何记录这种情况。显然,我可以检测异常类型和消息文本,但如果我想而不是在请求为.TransferRequest'd(或.Transfer'd)时进行特殊的日志记录,我该怎么做?

我已经检查了Response.IsRequestBeingRedirected——它是false

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

每个Server.Transfer都会向堆栈添加一个不安全的请求完成调用,因此,如果其中有1个以上,您可能会认为请求是由Server.TransferServer.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();
}

Server.TransferRequest接受头集合。您可以添加一个特殊的技术标题,然后稍后查找。

Server.TransferRequest(url,
    true,
    method: "GET",
    headers: new NameValueCollection() { { "transferred", "true" } });
//and then
bool isTransferred = (Request.Headers["transferred"] != null);