【问题标题】:Determine if Server.Transfer[Request] was executed确定是否执行了 Server.Transfer[Request]
【发布时间】:2016-02-27 02:09:35
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: c# asp.net asp.net-mvc error-handling


    【解决方案1】:

    每个 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();
    }
    

    【讨论】:

    • 这似乎在我测试了一下之后起作用(只有生产中的时间会告诉我们,嗯),但我确实需要为我们将 requestCompletionCount 限制设置为 4 或更高。我不知道为什么,但一般错误的 requestCompletionCount 为 2,而 SessionStateTempDataProvider 错误(可能在传输中)为 4。
    • @Matthew 希望一切顺利。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-09-06
      • 2013-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多