在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); } }
用viewdata把session传到页面去试一下
你页面中这句话里var UserData = Session["UserData"] as String;应该取的不是session["UserData"]吧。取ViewBag.UserData1.
@如此拉风的女人: var UserData = Session["UserData"] as String;是取的Session里面的值,ViewBag.UserData1是为了标识在action里面读取到了session的值,然后在页面里面可以看到action里面有这个值了
WebService 里面没有session的 (webservice只是个数据接口 不处理状态)
wcf支持 session 但是也是访问者的session 而不是 访问站点的session
你这块考虑问题的思路错了
你要获取session 就不要走webservice 直接 用 action
但是我通过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是局部的。
@事理: 我怎么记得 不是这样啊
而且还有一点 你是同一个浏览器(同一个客户端)的访问么?
@小眼睛老鼠: 是通过接口返回登录成功后的sessionid,然后附加上sessionid后访问需要登录的页面,相当于同一个浏览器访问
@事理: 你多试试吧 反正我的印象是 webservice 是没有状态的 这点我以前弄过
很特殊
@小眼睛老鼠: 好吧,谢谢你的回复