使用ASP.NET Web API访问会话

我意识到session和REST并不完全同时进行,但是使用新的webapi访问session状态是不可能的吗HttpContext.Current.Session始终为空

MVC

对于MVC项目,进行以下更改(WebForms和Dot Net Core回答如下):

WebApiConfig.cs

公共静态类WebApiConfig
{
公共静态字符串URL前缀{get{return“api”;}
公共静态字符串UrlPrefixRelative{get{return“~/api”;}
公共静态无效寄存器(HttpConfiguration配置)
{
config.Routes.MapHttpRoute(
名称:“DefaultApi”,
routeTemplate:WebApiConfig.UrlPrefix+“/{controller}/{id}”,
默认值:新建{id=RouteParameter.Optional}
);
}
}

Global.asax.cs

公共类MVCAPApplication:System.Web.HttpApplication
{
...
受保护的无效应用程序\u PostAuthorizerRequest()
{
if(IsWebApiRequest())
{
HttpContext.Current.SetSessionStateBehavior(SessionStateBehavior.Required);
}
}
私有bool iswebapirest()
{
返回HttpContext.Current.Request.AppRelativeCurrentExecutionFilePath.StartWith(WebApiConfig.UrlPrefixRelative);
}
}

此解决方案还有一个额外的好处,即我们可以获取javascript中的基本URL来进行AJAX调用:

_Layout.cshtml

<车身>
@RenderBody()
<script type=“text/javascript”>
var apiBaseUrl='@Url.Content(ProjectNameSpace.WebApiConfig.UrlPrefixRelative)';
&lt/脚本>
@RenderSection(“脚本”,必需:false)

然后,在我们的Javascript文件/代码中,我们可以调用webapi来访问会话:

$.getJSON(apiBaseUrl+'/MyApi')
.完成(功能(数据){
警报(“接收到的会话数据:”+data.whatever);
})
);

网络表单

执行上述操作,但将WebApiConfig.Register函数改为采用RouteCollection:

公共静态无效寄存器(路由收集路由)
{
routes.MapHttpRoute(
名称:“DefaultApi”,
routeTemplate:WebApiConfig.UrlPrefix+“/{controller}/{id}”,
默认值:新建{id=RouteParameter.Optional}
);
}

然后在应用程序_Start中调用以下命令:

WebApiConfig.Register(RouteTable.Routes);

网芯

添加Microsoft.AspNetCore.SessionNuGet包,然后进行以下代码更改:

Startup.cs

在ConfigureServices函数中对服务对象调用AddDistributedMemoryCacheAddSession方法:

公共void配置服务(IServiceCollection服务)
{
services.AddMvc();
...
AddDistributedMemoryCache();
services.AddSession();

在Configure函数中添加对UseSession的调用:

公共void配置(IApplicationBuilder应用程序、IHostingEnvironment环境、,
伊洛格工厂(伐木厂)
{
app.UseSession();
app.UseMvc();

SessionController.cs

在控制器中,在顶部添加using语句:

使用Microsoft.AspNetCore.Http;

然后在代码中使用HttpContext.Session对象,如下所示:

[HttpGet(“set/{data}”)]
公共IActionResult setsession(字符串数据)
{
HttpContext.Session.SetString(“keyname”,数据);
返回Ok(“会话数据集”);
}
[HttpGet(“get”)]
公共IActionResult getsessiondata()
{
var sessionData=HttpContext.Session.GetString(“keyname”);
返回Ok(sessionData);
}

您现在应该能够点击:

http://localhost:1234/api/session/set/thisissomedata

然后转到此URL将其拉出:

http://localhost:1234/api/session/get

有关访问dot net core内会话数据的更多信息,请访问:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/app-state

性能问题

请阅读下面Simon Weaver关于性能的回答。如果您在WebApi项目中访问会话数据,可能会产生非常严重的性能后果-我看到ASP.NET对并发请求强制执行200毫秒延迟。如果您有许多并发请求,这可能会加起来导致灾难性后果


安全问题

确保您锁定了每个用户的资源-经过身份验证的用户不应该能够从您的WebApi检索他们无权访问的数据

阅读Microsoft关于ASP.NET Web API中的身份验证和授权的文章-https://www.asp.net/web-api/overview/security/authentication-and-authorization-in-aspnet-web-api

阅读Microsoft关于避免跨站点请求伪造黑客攻击的文章(简而言之,请查看AntiForgery.Validate方法)——https://www.asp.net/web-api/overview/security/preventing-cross-site-request-forgery-csrf-attacks

发表评论