【发布时间】: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