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

标签 asp.net asp.net-web-api

我意识到 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/

相关文章:

asp.net - WebForm_PostBackOptions 文档

asp.net-web-api - Swagger 不显示真正的错误消息

c# - PHP/ASP.NET MVC Web-Api 有人知道如何使用PHP通过POST调用WEBAPI

带有 MySQL 的 ASP.NET MVC 4 Web API 不断抛出 DataReader Open 异常

c# - 使用客户端证书时,大型 POST 请求会导致 Asp.Net Web API 超时

asp.net - asp.net 中下拉列表的酷样式?

asp.net - 带有 EPPlus 2.9 的 Chrome 16 中出现“从服务器收到重复 header ”错误

mysql - 需要对代码进行一些修改

c# - ASP.NET WebApi - 如何将集合发布到 WebApi 方法?

c# - 排除/包含导航属性