webapi中使用session

修改global.cs里面的内容
using System;
using System.Web;
using System.Web.Routing;
using System.Web.Http;
using System.Web.Http.WebHost;
using System.Web.SessionState; namespace ApiControllerExample
{
public class Global : System.Web.HttpApplication
{ public override void Init()
{
//取下注释下面这行语句,将使得全部Api都可以访问Session
//this.PostAuthenticateRequest += (s, e) => HttpContext.Current.SetSessionStateBehavior(SessionStateBehavior.Required);
base.Init();
} protected void Application_Start(object sender, EventArgs e)
{
RouteConfig.RegisterRoutes(RouteTable.Routes); // 注册路由
}
} public class SessionableControllerHandler : HttpControllerHandler, IRequiresSessionState
{
public SessionableControllerHandler(RouteData routeData) : base(routeData) { }
} public class SessionStateRouteHandler : IRouteHandler
{
IHttpHandler IRouteHandler.GetHttpHandler(RequestContext requestContext)
{
return new SessionableControllerHandler(requestContext.RouteData);
}
} public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.MapHttpRoute(
name: "WebApiRoute1",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
).RouteHandler = new SessionStateRouteHandler(); // 使用Session routes.MapHttpRoute(
name: "WebApiRoute2",
routeTemplate: "api/{controller}/{id}/{id2}",
defaults: new{id = RouteParameter.Optional }
); // 不使用Session
}
}
} webapi用例:
using System;
using System.Web.Http; namespace ApiControllerExample
{
public class StateController : ApiController
{
public string Get(int id)
{
try
{
return GetStateInfo(id);
}
catch (Exception err)
{
return "excep: " + err.Message;
}
} private string GetStateInfo(int id)
{
System.Web.HttpContext context = System.Web.HttpContext.Current; if (id == 1)
{
return context.Session["state"].ToString();
}
else if (id == 2)
{
return context.Cache["state"].ToString();
}
else
{
return context.Application["state"].ToString();
}
} //这个方法无法使用Session
public string Get(int id, int id2)
{
System.Web.HttpContext context = System.Web.HttpContext.Current; try
{
return context.Session["state"].ToString();
}
catch (Exception err)
{
return "excep: " + err.Message;
}
}
}
}

  

Web APi全局启动Session(一)

以下皆在Global.asax全局文件中进行。

第一步(定义两个变量)

 private const string WebApiPrefix = "APi";
private static string WebApiExecutePath = string.Format("~/{0}", WebApiPrefix);

第二步(获取当前请求的路径)

 private bool isWebAPiRequest()
{
  return HttpContext.Current.Request.AppRelativeCurrentExecutionFilePath.StartsWith(WebApiExecutePath);
}

第三步(若请求Web APi则启动Session)

        protected void Application_PostAuthorizeRequest()
{
if (isWebAPiRequest())
{
HttpContext.Current.SetSessionStateBehavior(System.Web.SessionState.SessionStateBehavior.Required);
}
}

第四步(测试代码)

        protected void Session_Start()
{
HttpContext.Current.Session.Add("xpy0928", "嗨-博客");
var session_value = HttpContext.Current.Session["xpy0928"];
}

Web APi全局启动Session(二)

之前我们在Web APi系列中讲到过HttpControllerRouteHandler,此类中的GetHttpHandler方法返回HttpControllerHandler的一个实例即HttpHandler,通过此HttpHandler是进入Web APi消息处理管道的入口点,我们可以使用在IHttpHandler上的Session实现IRquiressionstate接口即可。

第一步(启动Session)

        protected void Application_PostAuthorizeRequest()
{
HttpContext.Current.SetSessionStateBehavior(System.Web.SessionState.SessionStateBehavior.Required);
}

第二步(自定义实现HttpHandler)

    public class EnableSession_ControllerHandler : HttpControllerHandler, IRequiresSessionState
{
public EnableSession_ControllerHandler(RouteData routeData)
: base(routeData)
{ }
}

第三步(获取HttpHandler)

    public class EnableSession_ControllerHandler : HttpControllerHandler, IRequiresSessionState
{
public EnableSession_ControllerHandler(RouteData routeData)
: base(routeData)
{ }
}

第四步(路由配置进行获取自定义RouteHandler)

          routes.MapHttpRoute(
name: "DefaultAPi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = UrlParameter.Optional }
).RouteHandler = new EnableSession_HttpControllerRouteHandler();

第五步(在Web APi配置文件中实现自定义HttpControllerRouteHandler)

        public static void Register(HttpConfiguration config)
{
var httpControllerRouteHandler = typeof(HttpControllerRouteHandler).GetField("_instance",
BindingFlags.Static |
BindingFlags.NonPublic); if (httpControllerRouteHandler != null)
{
httpControllerRouteHandler.SetValue(null,
new Lazy<HttpControllerRouteHandler>(() => new EnableSession_HttpControllerRouteHandler(), true));
} config.MapHttpAttributeRoutes(); }

此时运行将出现如下错误:

第六步(测试代码)

        public void Get()
{
object context;
if (Request.Properties.TryGetValue("MS_HttpContext", out context))
{
var httpContext = context as HttpContextBase;
if (httpContext != null && httpContext.Session != null)
{
var lastValue = httpContext.Session["xpy0928"] as int?;
httpContext.Session["xpy0928"] = "博客园";
var session_value = httpContext.Session["xpy0928"];
}
}
}

总结

以上两种方法皆可在Web APi中启动Session,你觉得那个简单就按照对应的来。我们需要注意一个问题是:在Web APi中,Web APi是不依赖于HttpContext,也就是HttpContext.Current肯定是为null的,我们要访问Session或者其他对象需要使用Rquest对象中的属性Properties来获得你想的值或者来设置值。

在Controller里:
 public class ValuesController : ApiController
    {
        // GET api/values
        public IEnumerable<string> Get()
        {
            var context = HttpContext.Current;
            context.Session["a"] = "aaa";
            return new string[] { "value1", "value2" };
           
        }
 
        // GET api/values/5
        public string Get(int id)
        {
            var ses = HttpContext.Current.Session["a"];
            return ses.ToString();
        }
    }
 
执行时出报异常,这时要在Global.asax里添加:开启Session功能
 public class WebApiApplication : System.Web.HttpApplication
    {
        public override void Init()
        {
            this.PostAuthenticateRequest += (sender, e) => HttpContext.Current.SetSessionStateBehavior(SessionStateBehavior.Required);
            base.Init();
        }
----------------------------------------------------------------------------------------------
 
    // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码、svc 和配置文件中的类名“sv”。
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    public class sv : Isv
 
  <system.serviceModel>
    <services>
      <service name="Tools.sv">
        <endpoint address="" binding="webHttpBinding" bindingConfiguration=""
          contract="Tools.Isv" />
      </service>
    </services>
    <bindings />
    <behaviors>
      <endpointBehaviors>
        <behavior name="">
          <webHttp />
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior name="">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <standardEndpoints />
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"></serviceHostingEnvironment>
 
												

webapi session的更多相关文章

  1. asp.net core webapi Session 跨域

    在ajax 请求是也要加相应的东西 $.ajax({ url:url, //加上这句话 xhrFields: { withCredentials: true } success:function(re ...

  2. asp.net core webapi Session 内存缓存

    Startup.cs文件中的ConfigureServices方法配置: #region Session内存缓存 services.Configure<CookiePolicyOptions&g ...

  3. WebApi Session支持

    代码: WebApiConfig using System; using System.Collections.Generic; using System.Linq; using System.Net ...

  4. WebAPI中无法获取Session对象的解决办法

    在MVC的WebApi中默认是没有开启Session会话支持的.需要在Global中重写Init方法来指定会话需要支持的类型 public override void Init() { PostAut ...

  5. 在WebAPI使用Session

    最近在改写WebApp时要将以前用泛型处理例程写的Captcha 改成使用WebApi 来实作机制,在实作的过程中发现使用IRequiresSessionState session也无法使用(cont ...

  6. webapi mvc session一直获取不到问题

    前一段时间在给移动端写接口时遇到一个调用接口发送邮箱 session 一直获取不到的问题.我来给遇到问题的同志们说一说 自个在网上查了好多资料,问了一些朋友后.终于找到解决方案了. 大家都知道weba ...

  7. 启用 mvc webapi 的 session功能可用

    默认 mvc webapi 不开启 session 会话支持 所以需要修改配置,在 Global 开启 session 支持 如下: 1.重写 init() 方法 public override vo ...

  8. MVC4+WebApi+Redis Session共享练习(下)

    上一篇文章我们主要讲解了一些webApi和redis缓存操作,这篇文章我们主要说一些MVC相关的知识(过滤器和错误处理),及采用ajax调用webApi服务. 本篇例子采用的开发环境为:VS2010( ...

  9. MVC4+WebApi+Redis Session共享练习(上)

    这几天生病了,也没有心情写博客,北京医院真心伤不起呀,钱不少花,病没治好,还增加了新病,哎不说了,周末还得去大医院检查一下,趁女盆友还没有回来,把前几天写的东西总结一下.本文也会接触一点webApi的 ...

随机推荐

  1. Kali linux 2018 安装 Fluxion

    本人是在VMware 12下安装 Kali linux 2018.2版本 安装完成后 用命令行运行更新   apt-get update apt-get full-upgrade   更新所有组件. ...

  2. 2019 SDN第五次上机作业

    2019 SDN第五次上机作业 作业链接 1.浏览RYU官网学习RYU控制器的安装和RYU开发入门教程,提交对于教程代 码的理解,包括但不限于: 安装RYU控制器并测试 安装教程 安装过程及遇到各种问 ...

  3. Wireshark常用快捷键&&过滤器语法

    目录 一.快捷键 二.过滤器语法 1.捕获过滤器的BPF(Berkeley Packet Filter)语法 2.显示过滤器 一.快捷键 Ctrl+M 标记/取消标记 shift+ctrl+N/B 下 ...

  4. .lib和.dll文件

    LIB文件中存放的是函数调用的信息,值得一提的是数据库有静态数据库(.lib文件)和动态数据库(.dll文件). 静态编译 静态编译将导出声明和实现都放在lib中.编译后所有代码都嵌入到宿主程序. 静 ...

  5. DATEADD (Transact-SQL)

    DATEADD (Transact-SQL) This function adds a specified number value (as a signed integer) to a specif ...

  6. python pycharm错误集锦

    url:http://www.cnblogs.com/hinimix/p/8016859.html 1, this list creation could be rewritten as a list ...

  7. phpstudy5.6 No input file specified的解决方法

    一.问题描述 5.6就提示这个错误,切换5.5就可以 二.原因分析 原因1:提示:“No input file specified.”原因在于使用的PHP5.6是fast_cgi模式,而在某些情况下, ...

  8. 工具系列 | VScode VS Live Share 实时编码分享(和你的小伙伴一起写代码吧)

    Visual Studio Live Share能干啥? 分享任何语言,任何应用程序 无论您正在构建什么类型的应用程序,您正在编写什么语言,或者您的操作系统如何:在您需要协作时,Live Share会 ...

  9. 离线安装pycharm数据库驱动

    这个数据库驱动,不是python的链接包 而是打开pycharm pro版后的数据库浏览器驱动. 也就是专业版比社区版方便的一个地方,可以直接边写代码,边看数据库结构,还可以拖动一些变量. 在线安装挺 ...

  10. [LeetCode] 533. Lonely Pixel II 孤独的像素 II

    Given a picture consisting of black and white pixels, and a positive integer N, find the number of b ...