我意识到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)';
</脚本>;
@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函数中对服务对象调用AddDistributedMemoryCache和AddSession方法:
公共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