ASP.Net WebAPI ExecuteAsync在执行控制器操作之前结束

时间:2017-12-11 07:45:41

标签: c# asp.net asp.net-web-api

首先我想说明我的问题可能是环境/项目特定的,并且很难根据我展示的代码来解决 - 我已经意识到了这一点,但我已经跑了出于想法可能出错,我需要寻求帮助。

我有遗产项目。有WebApi控制器:

  1. BaseApiControl

    public abstract class BaseApiController : ApiController
    {
        public override Task<HttpResponseMessage> ExecuteAsync(System.Web.Http.Controllers.HttpControllerContext controllerContext, CancellationToken cancellationToken)
        {
            return base.ExecuteAsync(controllerContext, cancellationToken);
        }
    }
    
  2. TokenAuthorizeAttribute:

    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false)]
    public class TokenAuthorizeAttribute : AuthorizeAttribute
    {
        public override void OnAuthorization(HttpActionContext actionContext)
        {
            // authorization... if succeed culture is set:
    
            Thread.CurrentThread.CurrentCulture = Thread.CurrentThread.CurrentUICulture = new CultureInfo("de");
    
            return;
        }
    }
    
  3. ValuesController:

    public class ValuesController : BaseApiController
    {
        [TokenAuthorize]
        [HttpGet]
        [Route("api/values")]
        public IEnumerable<string> Get()
        {
            var c = Thread.CurrentThread.CurrentUICulture;
            var b = Thread.CurrentThread.CurrentCulture;
    
            return new string[] { "value1", "value2" };
        }
    }
    
  4. 问题是,即使我在控制器Get操作中的TokenAuthorizeAttribute中设置文化,也会显示旧的文化,而不是我在TokenAuthorizeAttribute中设置的文化。

    我认为这是因为执行异步方法调用其他线程上的过滤器,因此为另一个线程设置了TokenAuthorizeAttribute中的文化。

    我做了一个实验并将此代码复制到新的WebApi项目中,结果证明 - 一切正常。我想知道为什么会这样。我发现在新创建的项目中,请求流程如下:

    1. BaseApiController.ExecuteAsync方法开始执行
    2. 执行TokenAuthorizeAttribute.OnAuthorization方法
    3. 执行ValuesController.Get方法
    4. BaseApiController.ExecuteAsync方法结束执行
    5. 在我的遗留项目中,流程如下:

      1. BaseApiController.ExecuteAsync方法开始执行
      2. 执行TokenAuthorizeAttribute.OnAuthorization方法
      3. BaseApiController.ExecuteAsync方法结束执行
      4. 执行ValuesController.Get方法
      5. 我真的很惊讶。有谁知道为什么这个请求处理流程可能有所不同?我已经检查了web.config和global.asax.cs并禁用了所有自定义配置,如http模块,消息处理程序,格式化程序等,但没有任何帮助。

0 个答案:

没有答案