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

4

我正在调试两个问题,发现当执行一个操作时:

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

我希望当我的Application_Error触发并捕获异常"The SessionStateTempDataProvider class requires session state to be enabled."时,能够控制这种情况如何记录日志。明显地,我可以检测异常类型和消息文本,但如果我想在请求使用.TransferRequest.Transfer时不进行特殊日志记录,该怎么做呢?

我已经检查过Response.IsRequestBeingRedirected,其值为false

2个回答

3
每次Server.Transfer都会向堆栈中添加一个不安全的请求完成调用,因此,如果有多个这样的情况,您可能会认为请求是由其中一个Server.Transfer或Server.TransferRequest方法内部重定向的。
以下是一个布尔函数,您可以将其添加到全局.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();
}

经过我的测试,这似乎可以工作(只有在生产中的时间才能证明),但是我确实需要将“requestCompletionCount”限制设置为4或更高。我不知道为什么,但一般错误的“requestCompletionCount”为2,而SessionStateTempDataProvider错误(可能在传输时)为4。 - mlhDev
@Matthew,希望一切都能顺利解决。 - Oguz Ozgul

1

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

Server.TransferRequest(url,
    true,
    method: "GET",
    headers: new NameValueCollection() { { "transferred", "true" } });

//and then
bool isTransferred = (Request.Headers["transferred"] != null);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接