首先我想说明我的问题可能是环境/项目特定的,并且很难根据我展示的代码来解决 - 我已经意识到了这一点,但我已经跑了出于想法可能出错,我需要寻求帮助。
我有遗产项目。有WebApi控制器:
BaseApiControl
public abstract class BaseApiController : ApiController
{
public override Task<HttpResponseMessage> ExecuteAsync(System.Web.Http.Controllers.HttpControllerContext controllerContext, CancellationToken cancellationToken)
{
return base.ExecuteAsync(controllerContext, cancellationToken);
}
}
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;
}
}
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" };
}
}
问题是,即使我在控制器Get操作中的TokenAuthorizeAttribute中设置文化,也会显示旧的文化,而不是我在TokenAuthorizeAttribute中设置的文化。
我认为这是因为执行异步方法调用其他线程上的过滤器,因此为另一个线程设置了TokenAuthorizeAttribute中的文化。
我做了一个实验并将此代码复制到新的WebApi项目中,结果证明 - 一切正常。我想知道为什么会这样。我发现在新创建的项目中,请求流程如下:
在我的遗留项目中,流程如下:
我真的很惊讶。有谁知道为什么这个请求处理流程可能有所不同?我已经检查了web.config和global.asax.cs并禁用了所有自定义配置,如http模块,消息处理程序,格式化程序等,但没有任何帮助。