MVC
对于 MVC 项目进行以下更改(WebForms 和 Dot Net Core 回答如下):
WebApiConfig.cs
public static class WebApiConfig
{
public static string UrlPrefix { get { return "api"; } }
public static string UrlPrefixRelative { get { return "~/api"; } }
public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: WebApiConfig.UrlPrefix + "/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
Global.asax.cs
public class MvcApplication : System.Web.HttpApplication
{
...
protected void Application_PostAuthorizeRequest()
{
if (IsWebApiRequest())
{
HttpContext.Current.SetSessionStateBehavior(SessionStateBehavior.Required);
}
}
private bool IsWebApiRequest()
{
return HttpContext.Current.Request.AppRelativeCurrentExecutionFilePath.StartsWith(WebApiConfig.UrlPrefixRelative);
}
}
这个解决方案还有一个额外的好处是我们可以在 javascript 中获取基本 URL 以进行 AJAX 调用:
_Layout.cshtml
<body>
@RenderBody()
<script type="text/javascript">
var apiBaseUrl = '@Url.Content(ProjectNameSpace.WebApiConfig.UrlPrefixRelative)';
</script>
@RenderSection("scripts", required: false)
然后在我们的 Javascript 文件/代码中,我们可以进行可以访问会话的 webapi 调用:
$.getJSON(apiBaseUrl + '/MyApi')
.done(function (data) {
alert('session data received: ' + data.whatever);
})
);
网络表单
执行上述操作,但将 WebApiConfig.Register 函数更改为采用 RouteCollection:
public static void Register(RouteCollection routes)
{
routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: WebApiConfig.UrlPrefix + "/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
然后在Application_Start中调用如下:
WebApiConfig.Register(RouteTable.Routes);
点网核心
添加 Microsoft.AspNetCore.Session NuGet 包,然后进行以下代码更改:
Startup.cs
在 ConfigureServices 函数中调用服务对象的 AddDistributedMemoryCache 和 AddSession 方法:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
...
services.AddDistributedMemoryCache();
services.AddSession();
并在 Configure 函数中添加对 UseSession 的调用:
public void Configure(IApplicationBuilder app, IHostingEnvironment env,
ILoggerFactory loggerFactory)
{
app.UseSession();
app.UseMvc();
SessionController.cs
在您的控制器中,在顶部添加一条 using 语句:
using Microsoft.AspNetCore.Http;
然后在代码中使用 HttpContext.Session 对象,如下所示:
[HttpGet("set/{data}")]
public IActionResult setsession(string data)
{
HttpContext.Session.SetString("keyname", data);
return Ok("session data set");
}
[HttpGet("get")]
public IActionResult getsessiondata()
{
var sessionData = HttpContext.Session.GetString("keyname");
return Ok(sessionData);
}
你现在应该可以打了:
http://localhost:1234/api/session/set/thisissomedata
然后去这个网址就会把它拉出来:
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 检索他们无权访问的数据。
阅读微软关于 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