javascript - 如何从 ASP.NET 委托(delegate)执行 Response.Redirect

标签 javascript jquery asp.net delegates signalr

我尝试了以下典型方法,但无法从异步 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 个场景:

  1. 异步操作是使用HostingEnvironment.QueueBackgroundWorkItem从正常的HTTP请求中开始的。 (.NET 4.5.2 及以上)。

    请求的资源(如果适用)会被处理/渲染并返回。请求已完成。不再有任何重定向请求。在这种情况下,您也许可以在 Application cache 中存储一个值。并在下一个请求时重定向用户的到期时间。

  2. 您的客户端通过 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/

    相关文章:

    javascript - 停止$.each,加载图像然后继续循环

    jquery - 使用 Slidedown() 显示新附加的元素

    c# - 在 ASP.Net 站点中使用 AJAX 调用时,REST WCF 服务会锁定线程

    .net - Application_Error 不会触发?

    JavaScript 找出数字从哪里开始并添加标签

    javascript - 将一个 div 附加到动态创建的 div

    javascript - 按 AngularJS 中的原样打印页面

    javascript - 多行 HTML 选项标签的解决方法是什么?

    jquery - 使用 jquery 防止 div 内所有链接的默认设置

    asp.net - 在运行 ASP.NET 的网站中,如何显示存储在 MS Access 2007 附件类型中的图像