【问题标题】:Sharing session between MVC controller and WebApi controllerMVC 控制器和 WebApi 控制器之间的共享会话
【发布时间】:2014-08-11 14:42:40
【问题描述】:

我有一个具有 MVC 控制器和 WepAPI 2 控制器的 Web 服务。

MVC 控制器的工作是为局部视图呈现和返回 HTML。一个不同的 MVC 应用程序进行该调用,然后将生成的 HTML 嵌入到它自己的页面中。

部分视图包含一些调用 WebAPI 控制器以临时存储数据的控件。为此,我使用Global.asax.cs 中的代码在 WebAPI 控制器中启用了会话:

protected void Application_PostAuthorizeRequest() {
    HttpContext.Current.SetSessionStateBehavior(
        System.Web.SessionState.SessionStateBehavior.Required);
}

当调用应用程序调用 MVC 控制器时,它会将模型传递给它。该模型包含部分视图上的控件需要显示的一些初始数据。这与控件将使用 WebAPI 控制器创建/更新/删除的数据相同。我想将模型中的数据放入会话中,以便局部视图中的控件能够读取/更新/删除这些数据。

我的问题是:有什么方法可以让 MVC 控制器访问 WepAPI 会话?或者有什么方法可以让 WebAPI 控制器使用与 MVC 控制器相同的会话?

【问题讨论】:

  • 尽量避免像这样将状态强加到您的应用程序中 - 将您需要发送到 ApiController 的数据作为隐藏字段或数据属性放入视图中,这样您就可以在不依赖会话状态的情况下发送它们。
  • 我不能。部分视图中的控件是依赖于具有 CRUD 方法的服务器的 Kendo 网格。为了让网格正常工作,我必须将数据存储在服务器上。

标签: asp.net-mvc session asp.net-mvc-5


【解决方案1】:

在您的 Global.asax 中添加以下代码

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);
    }

}

【讨论】:

    猜你喜欢
    • 2017-07-16
    • 2014-01-05
    • 1970-01-01
    • 2016-11-30
    • 2012-02-16
    • 2017-11-21
    • 1970-01-01
    • 1970-01-01
    • 2012-12-12
    相关资源
    最近更新 更多