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);
}
}
Это решение имеет дополнительный бонус, заключающийся в том, что мы можем получить базовый URL в javascript для выполнения вызовов 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);
})
);
WebForms
Сделайте вышеописанное, но измените функцию 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);
Dot Net Core
Добавьте пакет Microsoft.AspNetCore.Session NuGet и внесите следующие изменения кода:
Startup.cs
Вызовите методы AddDistributedMemoryCache и AddSession для объекта служб в функции ConfigureServices:
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
, а затем переход по этому URL выведет его:
http://localhost:1234/api/session/get
Здесь вы найдете больше информации о доступе к данным сеанса в ядре dot net: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/app-state
Проблемы производительности
Прочитайте Simon Weaver'sответ ниже относительно производительности.Если вы обращаетесь к данным сеанса внутри проекта 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