none
请问如何能让用户经过验证后,一直保持和服务器的连接状态? RRS feed

  • 问题

  • 开发环境:
    windows server 2008 standard SP2
    VS 2010 SP1
    ASP.NET 4 WebForms

    web.config 配置:
    <authentication mode="Forms">
        <forms cookieless="AutoDetect" loginUrl="~/Login.aspx" name="loginForm" path="/" protection="All" slidingExpiration="false" timeout="20">
            <credentials passwordFormat="SHA1"></credentials>
        </forms>
    </authentication>

    <authorization>
        <deny users="?" />
    </authorization>

    <sessionState mode="InProc" stateConnectionString="tcpip=127.0.0.1:42424" sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes"
       cookieless="false" timeout="50" />

    现在采用的方法:
    用户通过窗体验证登录后,用 ASP.NET AJAX 不停地循环调用 Web 服务。

    问题:
    过一段时间以后,用户就离线,调用 Web 服务返回 “身份验证失败” 错误,用户必需要重新登录。

    请问如何能让用户经过验证后,一直保持和服务器的连接状态?


    2012年12月11日 10:53

答案

全部回复

  • 在每个页面footer都插入一段js,如果使用母版页的话就只用插一个。

    设置一个timeout定时js,每次发送一个ajax请求。用jQuery.ajax很容易实现


    Willin.org

    2012年12月12日 2:38
  • 我现在把代码改现在这个样子, 还是不能一直保持连接。

    Loagin.aspx -> Default.aspx

    Default.aspx:

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="Oasis.Admin.Views.Default.Default" %>

    <%@ OutputCache Location="None" VaryByParam="None" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
    </head>
    <body>
        <form id="form1" runat="server">
        <asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="False">
            <Scripts>
                <asp:ScriptReference Path="~/Views/Default/Default.js" />
            </Scripts>
        </asp:ScriptManager>
        <iframe>固定 Default.aspx, 所有的网页在此 iframe 里导航</iframe>
        <script type="text/javascript">
            function intervalRequest() {
                $.ajax({
                    url: "IntervalRequest.aspx",  // IntervalRequest.aspx 是和 Default.aspx 在同一个目录里的网页
                    type: "GET",
                    dataType: "text",
                    contentType: "text/html; charset=utf-8",
                    cache: false,
                    success: function (data) {
                    },
                    error: function (jqXHR) {
                        alert(jaXHR.responseText);
                    }
                })
            };

            intervalRequest();
            window.setInterval(intervalRequest, 3000);
        </script>
        </form>
    </body>
    </html>

    web.config 配置:
    <authentication mode="Forms">
        <forms cookieless="AutoDetect" loginUrl="~/Login.aspx" name="loginForm" path="/" protection="All" slidingExpiration="false" timeout="20">
            <credentials passwordFormat="SHA1"></credentials>
        </forms>
    < /authentication>

    只要 timeout 时间一到,就失去与服务器的连接

    请问我这个方法哪里有问题?

    2013年1月10日 1:31
  • ...看来你得补一下js基础了。。。

    最好用settimeout,放在ajax的complete里


    Willin.org

    • 已标记为答案 学无Z境 2013年1月10日 3:05
    2013年1月10日 2:10
  • 现在改成了这样,还是不行。   


        <script type="text/javascript">
            function intervalRequest() {
                $.ajax({
                    url: "IntervalRequest.aspx",
                    type: "GET",
                    dataType: "text",
                    contentType: "text/html; charset=utf-8",
                    cache: false,
                    success: function (data) {
                    },
                    error: function (jqXHR) {
                        alert(jaXHR.responseText);
                    },
                    complete: function () {
                        window.setTimeout(intervalRequest, 10000);
                    }
                })
            };

            intervalRequest();
        </script>


    2013年1月10日 2:48
  • 你又贴一遍干什么


    Willin.org

    • 已标记为答案 学无Z境 2013年1月10日 3:06
    2013年1月10日 2:50
  • 我原先用 Window.setInterval
    这回按你的提示 用 settimeout 放在 $.ajax 的 complete 里了,然后重新试了,还是不行
    • 已标记为答案 学无Z境 2013年1月10日 3:05
    2013年1月10日 2:58
  • - -自己firebug。前台的问题就不做解答了。肯定是细节上的疏忽。

    Willin.org

    • 已标记为答案 学无Z境 2013年1月10日 3:05
    2013年1月10日 3:01