我尝试了以下典型方法,但无法从异步 ASP.NET 方法进行重定向:
Response.Redirect("~/Login.aspx");
HttpContext.Current.Response.Redirect("~/Login.aspx");
我也尝试过Server.Transfer
,但由于引用方法(委托(delegate))内的页面控件不可用而无法成功。
我已经尝试过一个静态属性,我填写了委托(delegate)响应,并使用 ASP.NET SignalR 在客户端不断检查它以执行重定向,但由于它是一个静态属性,它会重定向所有用户访问登录页面,但我不想这样做。
private void Response_Recieved(Message objMessage)
{
try
{
if (objMessage.OperationType == Operation.Data)
{
NotificationMessage objNotifications = new DataProcess().Deserialize_Messages(objMessage);
_jsonData = JsonConvert.SerializeObject(objNotifications);
}
else if (objMessage.OperationType == Operation.ServerAbnormalDisconnect)
{
// I want to redirect a user to login page whenever server disconnects
HttpContext.Current.Response.Redirect("~/Login.aspx");
//Response.Redirect("~/Login.aspx");
}
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}
当没有可用的控件且不使用任何静态属性时,从委托(delegate)函数执行重定向的替代或最佳方法是什么?
最佳答案
您无法从 ASP.Net 中的异步操作发出 HTTP 重定向调用,但有可行的替代方案。我将使我的答案变得通用,希望能够帮助其他读者,但作为 SignalR 用户,您需要查看第三点。
让我们看一下 3 个场景:
异步操作是使用HostingEnvironment.QueueBackgroundWorkItem从正常的HTTP请求中开始的。 (.NET 4.5.2 及以上)。
请求的资源(如果适用)会被处理/渲染并返回。请求已完成。不再有任何重定向请求。在这种情况下,您也许可以在 Application cache 中存储一个值。并在下一个请求时重定向用户的到期时间。您的客户端通过 Web 套接字连接,您的服务器端实现使用 Microsoft.WebSockets.dll 。与Web服务器的连接升级为全双工套接字连接;它不是页面的 URL,而是通信连接,因此无需重定向。
相反,您通过连接发送一条命令,通知客户端代码需要重定向,并且您在 JavaScript 中执行重定向。在
WebSocketHandler
,在此示例中发送字符串命令:Send("LOGOFF");
以及 JavaScript ws.onmessage
处理程序,将消息标识为“LOGOFF”并更改 window.location.href到目标页面:
ws.onmessage = function (message) {
switch (message.data) {
case "LOGOFF":
location.href = "Login.aspx";
}
};
上面的例子是经过简化的。我有一个网站可以执行此操作,并实际发送一个带有命令类型和可选负载的类(JSON 序列化)。
SignalR与#2 有相同的问题,我会提出类似的解决方案。我还没有使用过 SignalR,但根据 this answer 上的评论您可以像这样发送命令:
GlobalHost.ConnectionManager.GetHubContext<Chat>().Clients.Client(connectionId).addMessage("LOGOFF");
在 SignalR 客户端消息处理程序中查找 LOGOFF 消息,并将窗口位置 href 设置为您的登录页面。
关于javascript - 如何从 ASP.NET 委托(delegate)执行 Response.Redirect,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30873075/