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我希望一切都会好起来。