Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 确定是否执行了Server.Transfer[请求]_C#_Asp.net_Asp.net Mvc_Error Handling - Fatal编程技术网

C# 确定是否执行了Server.Transfer[请求]

C# 确定是否执行了Server.Transfer[请求],c#,asp.net,asp.net-mvc,error-handling,C#,Asp.net,Asp.net Mvc,Error Handling,我调试了两件事,发现当一个动作执行时: Server.TransferRequest(url); return new EmptyResult(); 我的应用程序\u错误将触发并捕获异常“SessionStateTempDataProvider类要求启用会话状态。” (我确实启用了会话状态,特别是StateServer,为了便于讨论,假设我不需要将此请求的更改提交回会话) 我想控制如何记录此场景。显然,我可以检测异常类型和消息文本,但是如果我不想在请求为.TransferRequest'd(或

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

Server.TransferRequest(url);
return new EmptyResult();
我的
应用程序\u错误将触发并捕获异常“SessionStateTempDataProvider类要求启用会话状态。”

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

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


我已经检查了
响应。IsRequestBeingRedirected
-它是
false

每个服务器。传输将向堆栈添加一个不安全的请求完成调用,因此,如果有超过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();
}

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

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

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

在我测试了一点之后,这似乎是可行的(只有生产中的时间才能知道,呃),但我确实需要为我们将
requestCompletionCount
限制设置为4或更高。我不知道为什么,但一般错误的
requestCompletionCount
为2,而SessionStateTempDataProvider错误(可能是在传输中)为4。@Matthew我希望一切都会好起来。