首页 新闻 会员 周边 捐助

asp.net mvc3 使用登录接口,页面不能读取到登录的session问题

0
悬赏园豆:60 [已解决问题] 解决于 2016-06-24 16:42

在mvc里面添加了一个登录的接口,通过接口返回ASP.NET_SessionId,附加ASP.NET_SessionId实现,用于授权客户端登录,结果发现controller里面的action中可以读取到session对象,转到对应的Views页面时,在页面里面的判断登录的代码就无法读取到session了,不知道大家有没有遇到过这种问题,求救。
asp.net webform就不会出现这种问题,可以通过附加ASP.NET_SessionId就可以登录了。

以下为登录接口

public class LoginWebService : System.Web.Services.WebService
    {
        [WebMethod(EnableSession = true)]
        public string Login(string userName, string passwd)
        {                
                Context.Session["UserData"] = "123";              
                return "ASP.NET_SessionId=" + Context.Session.SessionID;
        }
    }

 

登录后访问的action

       public ActionResult Index()
        {
                ViewBag.UserData1 = Session["UserData"];
                if (Session["UserData"] != null)//通过查看浏览器返回的cookie,也发现在action里面读取到了session
                      CommonFun.AddCookie("User", Session["UserData"].ToString(), DateTime.Now.AddMinutes(20));
                else
                       CommonFun.AddCookie("User", "用户未登录", DateTime.Now.AddMinutes(20));
               return View();
         }  

页面判断代码

@{
  ViewBag.Title = "Index";
    //var UserData = ViewBag.UserData1 as String;
    var UserData = Session["UserData"] as String;
}
    @if (UserData != null)
    {
        <span>登录成功</span>
    }else{
        <span>登录失败</span>
   }

通过ViewBag传递session值,页面上可以读取到有值

客户端调用接口实现自动登录(webform已经通过下面方法实现自动登录,asp.net mvc3页面无法读取到session)

[DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)]
 public static extern bool InternetSetCookie(string lpszUrlName, string lbszCookieName, string lpszCookieData);

        private void button1_Click(object sender, EventArgs e)
        {
            ServiceReference1.LoginWebServiceSoapClient login = new ServiceReference1.LoginWebServiceSoapClient(); 
           string  cookie = login.Login(textBox1.Text.Trim(), textBox2.Text.Trim());
            int startIndex = cookie.IndexOf("ASP.NET_SessionId");
            if (startIndex > -1)
            {
                string url = "http://www.xxx.com/home/index";
                string[] cookieArray = cookie.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries);

                foreach (string item in cookieArray)
                {
                    int startIndex1 = item.IndexOf('=');
                    string cookiename = item.Substring(0, startIndex1);
                    string cookievalue = item.Substring(startIndex1 + 1);
                    InternetSetCookie("http://www.xxx.com", cookiename, cookievalue);
                }
                webBrowser1.Navigate(url);
            }
            else
            {
                MessageBox.Show(cookie);
            }
        }
事理的主页 事理 | 菜鸟二级 | 园豆:244
提问于:2016-06-24 10:21
< >
分享
最佳答案
0

用viewdata把session传到页面去试一下

收获园豆:30
如此拉风的女人 | 初学一级 |园豆:30 | 2016-06-24 10:30

你页面中这句话里var UserData = Session["UserData"] as String;应该取的不是session["UserData"]吧。取ViewBag.UserData1.

如此拉风的女人 | 园豆:30 (初学一级) | 2016-06-24 10:34

@如此拉风的女人: var UserData = Session["UserData"] as String;是取的Session里面的值,ViewBag.UserData1是为了标识在action里面读取到了session的值,然后在页面里面可以看到action里面有这个值了

事理 | 园豆:244 (菜鸟二级) | 2016-06-24 10:37
其他回答(1)
0

WebService 里面没有session的 (webservice只是个数据接口 不处理状态)

wcf支持 session 但是也是访问者的session 而不是 访问站点的session

你这块考虑问题的思路错了

 

你要获取session 就不要走webservice  直接 用 action

收获园豆:30
小眼睛老鼠 | 园豆:2731 (老鸟四级) | 2016-06-24 10:49

但是我通过webservice的确创建了session对象,在controller里面的action里面也读取到了session的值了,而且我换成action作为登录接口,也是一样的页面不能读取到session值

[HttpPost]
        public ActionResult LoginWebService(string userName, string passwd)
        {
                Session["UserData"] = “123”;
                return Content("ASP.NET_SessionId=" + Session.SessionID);
        }

 

[DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)]
 public static extern bool InternetSetCookie(string lpszUrlName, string lbszCookieName, string lpszCookieData);

        private void button1_Click(object sender, EventArgs e)
        {
            string returnCookie = string.Empty;
            string postData = "userName=" + textBox1.Text.Trim() + "&passwd=" + textBox2.Text.Trim();
            WebHeaderCollection header;
            string cookie = HttpHelp.PostHtml("http://www.xxx.com/Login/LoginWebService", string.Empty, postData, ref returnCookie, true, true, out header, "application/x-www-form-urlencoded", Encoding.UTF8);
            int startIndex = cookie.IndexOf("ASP.NET_SessionId");
            if (startIndex > -1)
            {
                string url = "http://www.xxx.com/home/index";
                string[] cookieArray = cookie.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries);

                foreach (string item in cookieArray)
                {
                    int startIndex1 = item.IndexOf('=');
                    string cookiename = item.Substring(0, startIndex1);
                    string cookievalue = item.Substring(startIndex1 + 1);
                    InternetSetCookie("http://www.xxx.com", cookiename, cookievalue);
                }
                webBrowser1.Navigate(url);
            }
            else
            {
                MessageBox.Show(cookie);
            }
        }

 

webform里面通过webservice创建的session就会有值,感觉webform的session是全局的,而asp.net mvc里面的session是局部的。

支持(0) 反对(0) 事理 | 园豆:244 (菜鸟二级) | 2016-06-24 10:56

@事理: 我怎么记得 不是这样啊

而且还有一点 你是同一个浏览器(同一个客户端)的访问么?

支持(0) 反对(0) 小眼睛老鼠 | 园豆:2731 (老鸟四级) | 2016-06-24 11:05

@小眼睛老鼠: 是通过接口返回登录成功后的sessionid,然后附加上sessionid后访问需要登录的页面,相当于同一个浏览器访问

支持(0) 反对(0) 事理 | 园豆:244 (菜鸟二级) | 2016-06-24 11:07

@事理: 你多试试吧 反正我的印象是 webservice 是没有状态的 这点我以前弄过 

很特殊 

支持(0) 反对(0) 小眼睛老鼠 | 园豆:2731 (老鸟四级) | 2016-06-24 11:09

@小眼睛老鼠: 好吧,谢谢你的回复

支持(0) 反对(0) 事理 | 园豆:244 (菜鸟二级) | 2016-06-24 11:09
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册