我有一个面向 .NET Framework 4.7.1 的 ASP.NET MVC 4 应用程序,如果操作包含异步调用,则存在以下问题:控制器和视图之间不共享区域性。
我正在引用 NuGet 包Microsoft.AspNet.Mvc
5.2.3(并且可以在 5.2.4 中重现)。
这是控制器中的代码:
public class CulturesTestController : Controller
{
public async Task<ActionResult> Index(string value)
{
Thread.CurrentThread.CurrentCulture =
CultureInfo.GetCultureInfo("fi-FI");
Thread.CurrentThread.CurrentUICulture =
CultureInfo.GetCultureInfo("fi-FI");
var model = new CulturesContainer
{
CurrentCulture = Thread.CurrentThread.CurrentCulture,
CurrentUICulture = Thread.CurrentThread.CurrentUICulture,
CurrentThreadId = Thread.CurrentThread.ManagedThreadId
};
Log.Write(Level.Info, "CurrentUICulture - Before Await - " +
"CurrentCulture: " +
$"{Thread.CurrentThread.CurrentCulture}, " +
"CurrentUICulture: "
${Thread.CurrentThread.CurrentUICulture} -> "+
"ThreadId: " +
$"{Thread.CurrentThread.ManagedThreadId}");
await GetAwait();
Log.Write(Level.Info, "CurrentUICulture - After Await - " +
"CurrentCulture: " +
$"{Thread.CurrentThread.CurrentCulture}, " +
"CurrentUICulture: " +
$"{Thread.CurrentThread.CurrentUICulture} -> " +
"ThreadId: " +
$"{Thread.CurrentThread.ManagedThreadId}");
return View("Index", model);
}
public class CulturesContainer
{
public CultureInfo CurrentCulture { get; set; }
public int CurrentThreadId { get; set; }
public CultureInfo CurrentUICulture { get; set; }
}
private async Task GetAwait()
{
await Task.Yield();
}
}
这是视图中的代码:
@using System.Globalization
@using System.Threading
@model CultureTest.Controllers.CulturesTestController.CulturesContainer
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<title>title</title>
</head>
<body>
<div>
InitialCurrentCulture = {
<label>@Html.Raw(Model.CurrentCulture)</label>
} --
InitialCurrentUICulture = {
<label>@Html.Raw(Model.CurrentUICulture)</label>
} --
InitialThreadId = {
<label>@Html.Raw(Model.CurrentThreadId)</label>
}
<br />
ActualCurrentCulture = {
<label>@Html.Raw(CultureInfo.CurrentCulture)</label>
} --
ActualCurrentUICulture = {
<label>@Html.Raw(CultureInfo.CurrentUICulture)</label>
} --
ActualThreadId = {
<label>@Html.Raw(Thread.CurrentThread.ManagedThreadId)</label>
}
</div>
</body>
</html>
日志如下:
20180320-12:04:25.357-12 -INFO -CulturesTestController+<Index>d__0:
CurrentUICulture - Before Await -
CurrentCulture: fi-FI, CurrentUICulture: fi-FI -> ThreadId: 12
20180320-12:04:25.357-8 -INFO -CulturesTestController+<Index>d__0:
CurrentUICulture - After Await -
CurrentCulture: fi-FI, CurrentUICulture: fi-FI -> ThreadId: 8
虽然网页显示:
InitialCurrentCulture = { fi-FI } --
InitialCurrentUICulture = { fi-FI } -- InitialThreadId = { 12 }
ActualCurrentCulture = { en-US } --
ActualCurrentUICulture = { en-US } -- ActualThreadId = { 9 }
.NET Framework
如果线程是正在执行基于任务的异步操作的线程池线程,并且应用程序面向 .NET Framework 4.6 或更高版本的 .NET Framework,则其 UI 区域性由调用线程的 UI 区域性确定。 (来源https://msdn.microsoft.com/en-us/library/system.globalization.cultureinfo.currentuiculture(v=vs.110).aspx)
我是否没有正确处理CurrentCulture
,或者这就是它应该如何工作?对于 .NET Framework 4.x,我找不到与此问题相关的任何帖子。