gpt4 book ai didi

asp.net - 使用 ASP.NET Web API 访问 session

转载 作者:行者123 更新时间:2023-12-03 04:04:56 26 4
gpt4 key购买 nike

我意识到 session 和 REST 并不完全齐头并进,但是是否无法使用新的 Web API 访问 session 状态? HttpContext.Current.Session 始终为 null。

最佳答案

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 文件/代码中,我们可以进行可以访问 session 的 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 包,然后进行以下代码更改:

启动.cs

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

public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
...

services.AddDistributedMemoryCache();
services.AddSession();

并在配置函数中添加对UseSession的调用:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, 
ILoggerFactory loggerFactory)
{
app.UseSession();
app.UseMvc();

SessionController.cs

在 Controller 中,在顶部添加一条 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 中访问 session 数据的更多信息:https://learn.microsoft.com/en-us/aspnet/core/fundamentals/app-state

Performance Concerns

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

<小时/>

Security Concerns

确保锁定每个用户的资源 - 经过身份验证的用户不应该能够从他们无权访问的 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

关于asp.net - 使用 ASP.NET Web API 访问 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9594229/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com