确定是否执行了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都会向堆栈添加一个不安全的请求完成调用,因此,如果其中有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);