WebApi 能支持Session
2015-09-28 09:59
429 查看
由于项目实际需要,我希望让WebApi服务也能支持Session,所以便查找资料按照网上的方法开始着手实验。
然后就有了以下的代码,主要是说让WebApi支持Session,要重写Global.asax的Init方法
publicclassWebApiApplication:System.Web.HttpApplication
{
protectedvoidApplication_Start()
{
GlobalConfiguration.Configuration.EnableCors();
GlobalConfiguration.Configuration.Formatters.Insert(0,newJsonpMediaTypeFormatter());
AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);
WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
publicoverridevoidInit()//重写这个方法
{
PostAuthenticateRequest+=MvcApplication_PostAuthenticateRequest;
base.Init();
}
privatevoidMvcApplication_PostAuthenticateRequest(objectsender,EventArgse)
{
HttpContext.Current.SetSessionStateBehavior(SessionStateBehavior.Required);
}
}
重写方法后,准备动手编写测试的Controller代码如下,很简单的几句代码,A方法模拟第一次请求将携带的参数存入Session,其中键和值都为传入的参数appid,B方法是返回键为appid的session的值。
publicclassGetDataController:ApiController
{
[HttpGet]
publicvoidA(stringappid)
{
System.Web.HttpContext.Current.Session[appid]=appid;
System.Web.HttpContext.Current.Session.Timeout=1;
}
[HttpGet]
publicResponseDataB(stringappid)
{
returnnewResponseData(){data=System.Web.HttpContext.Current.Session[appid].ToString(),isSuccess=true};
}
}
用谷歌浏览器,模拟A\B两个请求,实验成功!!!!!很是高兴!!
但问题来了,通过浏览器运行可以取到session的值,但是在手机的移动设备端,访问居然每次获取session的值都是null,有些不解,便开始寻找问题的根源所在,为什么浏览器正常,然而在移动设备模拟就不行了呢??????功夫不负有心人,终于找到了问题所在,大概原因就是说,session是靠一个的cookie来区分的,客户端每次访问要携带这个cookie才能保持session的状态。于是我便用控制台模拟移动端进行测试。代码如下:
到此,一切测试完毕,正常运行。
初学webapi,哪有不对,希望园友多多指教!!!!!!!
然后就有了以下的代码,主要是说让WebApi支持Session,要重写Global.asax的Init方法
重写方法后,准备动手编写测试的Controller代码如下,很简单的几句代码,A方法模拟第一次请求将携带的参数存入Session,其中键和值都为传入的参数appid,B方法是返回键为appid的session的值。
用谷歌浏览器,模拟A\B两个请求,实验成功!!!!!很是高兴!!
但问题来了,通过浏览器运行可以取到session的值,但是在手机的移动设备端,访问居然每次获取session的值都是null,有些不解,便开始寻找问题的根源所在,为什么浏览器正常,然而在移动设备模拟就不行了呢??????功夫不负有心人,终于找到了问题所在,大概原因就是说,session是靠一个的cookie来区分的,客户端每次访问要携带这个cookie才能保持session的状态。于是我便用控制台模拟移动端进行测试。代码如下:
classProgram { staticvoidMain(string[]args) { GetMethod("http://192.168.1.9:8828/api/GetDAta/A?appid=abc"); //PostMethod("http://localhost:8828/api/GetDAta/Login/"); Console.ReadKey(); GetMethodTest("http://192.168.1.9:8828/api/GetDAta/b?appid=abc"); Console.ReadKey(); } privatestaticCookieContainerm_Cookie=newCookieContainer(); privatestaticvoidGetMethod(Stringurl) { HttpWebRequestrequest=WebRequest.Create(url)asHttpWebRequest; request.CookieContainer=m_Cookie; stringcookieheader=request.CookieContainer.GetCookieHeader(newUri(url)); m_Cookie.SetCookies(newUri(url),cookieheader); using(HttpWebResponseresponse=request.GetResponse()asHttpWebResponse) { StreamReaderreader=newStreamReader(response.GetResponseStream()); Console.WriteLine(reader.ReadToEnd()); } } privatestaticvoidGetMethodTest(Stringurl) { HttpWebRequestrequest=WebRequest.Create(url)asHttpWebRequest; request.CookieContainer=m_Cookie; m_Cookie=request.CookieContainer; using(HttpWebResponseresponse=request.GetResponse()asHttpWebResponse) { StreamReaderreader=newStreamReader(response.GetResponseStream()); Console.WriteLine(reader.ReadToEnd()); } } }
GetMethod为模拟访问A服务,其中以下代码,就是在访问A的时候设置cookie
request.CookieContainer=m_Cookie; stringcookieheader=request.CookieContainer.GetCookieHeader(newUri(url)); m_Cookie.SetCookies(newUri(url),cookieheader);
GetMethodTest为模拟访问B服务,请求时候需要携带上次访问A的cookie的信息,代码如下
request.CookieContainer=m_Cookie; m_Cookie=request.CookieContainer;
到此,一切测试完毕,正常运行。
初学webapi,哪有不对,希望园友多多指教!!!!!!!
相关文章推荐
- Centos6.4在配置Tomcat7工作文件夹和虚拟路径
- 最小二乘法深入
- Facebook发布React Native for Android
- Lvs+Keepalived+MySQL Cluster架设高可用负载均衡Mysql集群
- apps被拒绝的各种理由以及翻译
- RPM原理详解-spec文件
- C++ OOP面向对象
- Android电话号码无需拨号即可显示状态(空号、通话中、有空、欠费、不在服务区等),像QQ状态一样 小黄人软件原创
- Swift - 常用文件目录路径获取(Home目录,文档目录,缓存目录等)
- npm常用命令
- JS 回到顶部
- 将博客搬至CSDN
- Spring mvc JS上传文件
- 织梦标签大全
- 声明 & 推荐博客[置顶]
- Linux 中 10 个有用的命令行补全例子
- MACHINE-CHECK 相关的MSR(二) - Machine-Check 全局控制MSR
- MACHINE-CHECK 相关的MSR(一) - 概述
- Intel MCA 硬件机制概述
- 内核虚拟地址转物理地址的函数