【问题标题】:Single Action Request Without Session没有会话的单一动作请求
【发布时间】:2018-03-12 21:45:45
【问题描述】:

我正在尝试为同一用户发出操作的并行请求。我在我的 ASP.NET MVC 项目中使用 Session,所以服务器不会并行执行它们。

在网上搜索我找到了控制器的 SessionState 属性,但我需要它来执行操作。为此,我使用了 ActionSessionStateAttribute 并为此操作启用了匿名请求,但我遇到了问题,我在我的项目中使用 Windows 身份验证 并且(我不知道为什么)响应是在进入操作之前总是登录页面。

这种行为类似于 FormsAuthentication,但我不知道为什么 Windows 身份验证会忽略 AllowAnonymous。为什么会发生这种情况,我该如何解决?谢谢!

控制器:

[Authorize]
public MyController : BaseController
{
    [ActionSessionState(System.Web.SessionState.SessionStateBehavior.Disabled)]
    [AllowAnonymous]
    public ActionResult GetPartialWithoutSession()
    {
        return PartialView("_Partial");
    }
}

属性:

[AttributeUsage(AttributeTargets.Method)]
public sealed class ActionSessionStateAttribute : Attribute
{
    public SessionStateBehavior Behavior { get; private set; }
    public ActionSessionStateAttribute(SessionStateBehavior behavior)
    {
        this.Behavior = behavior;
    }

}

控制器工厂:

public class CustomControllerFactory : DefaultControllerFactory
{
    protected override SessionStateBehavior GetControllerSessionBehavior(RequestContext requestContext, Type controllerType)
    {
        if (controllerType == null)
        {
            return SessionStateBehavior.Default;
        }

        var actionName = requestContext.RouteData.Values["action"].ToString();
        MethodInfo actionMethodInfo = controllerType.GetMethod(actionName, BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance);
        if (actionMethodInfo != null)
        {
            var actionSessionStateAttr = actionMethodInfo.GetCustomAttributes(typeof(ActionSessionStateAttribute), false)
                .OfType<ActionSessionStateAttribute>()
                .FirstOrDefault();

            if (actionSessionStateAttr != null)
            {
                return actionSessionStateAttr.Behavior;
            }
        }
        return base.GetControllerSessionBehavior(requestContext, controllerType);
    }
}   

全球.asax:

    protected void Application_Start(Object sender, EventArgs e)
    {
        // ...
        ControllerBuilder.Current.SetControllerFactory(typeof(CustomControllerFactory));
    }

【问题讨论】:

  • 控制器类的Authorize属性甚至在它到达动作之前就拒绝了请求
  • @ChetanRanpariya 我尝试将 AllowAnonymous 作为控制器的注释并将其也删除.. 并没有解决问题

标签: c# asp.net asp.net-mvc


【解决方案1】:

我错过了一件事,在 web.config 中启用匿名身份验证:

<system.webServer>
    <security>
        <authentication>
            <anonymousAuthentication enabled="true" />
            <windowsAuthentication enabled="true" />
        </authentication>
    </security>
</system.webServer>

在此之后,我检查了PostAcquireRequestState 事件处理程序(可以在 Global.asax 或 http 处理程序处),如果 que 请求上没有附加会话,则会手动重定向到登录页面。

因此,如果有人遇到同样的问题,请定义我在问题上所做的相同设置,启用匿名身份验证并检查 http 请求生命周期的所有事件。

【讨论】:

    猜你喜欢
    • 2011-05-29
    • 2011-08-19
    • 2017-10-16
    • 2010-09-12
    • 2012-11-01
    • 2012-04-02
    • 2015-05-18
    • 2013-08-22
    • 2016-04-30
    相关资源
    最近更新 更多