ASP.NET MVC(异步)CurrentCulture 不在控制器和视图之间共享

2023-11-21

我有一个面向 .NET Framework 4.7.1 的 ASP.NET MVC 4 应用程序,如果操作包含异步调用,则存在以下问题:控制器和视图之间不共享区域性。

我正在引用 NuGet 包Microsoft.AspNet.Mvc5.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,我找不到与此问题相关的任何帖子。


我是否没有正确处理 CurrentCulture,或者这就是它应该如何工作?

你不是。需要设置当前UI线程的文化before进入你的异步操作方法。如果您在异步方法内部设置区域性,则它对 UI 线程没有影响(正如您所发现的)。

但撇开异步问题不谈,它是too late in the MVC的应用程序生命周期在操作方法内部设置区域性,因为 MVC 的一些重要的区域性敏感功能(即模型绑定)在此之前运行。

在生命周期中尽早设置区域性的一种方法是使用授权过滤器,这可确保在模型绑定发生之前设置区域性。

using System.Globalization;
using System.Threading;
using System.Web.Mvc;

public class CultureFilter : IAuthorizationFilter
{
    private readonly string defaultCulture;

    public CultureFilter(string defaultCulture)
    {
        this.defaultCulture = defaultCulture;
    }

    public void OnAuthorization(AuthorizationContext filterContext)
    {
        var values = filterContext.RouteData.Values;

        string culture = (string)values["culture"] ?? this.defaultCulture;

        CultureInfo ci = new CultureInfo(culture);

        Thread.CurrentThread.CurrentCulture = ci;
        Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(ci.Name);
    }
}

并在全球范围内注册它:

public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new CultureFilter(defaultCulture: "fi-FI"));
        filters.Add(new HandleErrorAttribute());
    }
}

上面的示例假设您已设置路由来添加culture作为类似于的路由值这个答案,但如果需要,您可以设计一个过滤器来从其他地方获取文化。

NOTE:我意识到这个问题与 .NET Core 无关,但正如 @GSerg 在评论中指出的那样,这同样的问题被报告为 ASP.NET Core 的错误,并被关闭为by design。他们得出的结论是一样的:

在资源过滤器内设置区域性将同时应用于操作和视图。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ASP.NET MVC(异步)CurrentCulture 不在控制器和视图之间共享 的相关文章

  • Windows 窗体中的切换开关控件

    我正在设计一个拨动开关控制使用CheckBox 但目前我的控件只能画一个圆圈 如何绘制如下图所示的圆形形状 以及如何根据控件的值更改圆圈的位置以表示选中和未选中的状态 如下图所示 这是我的代码 public class MyCheckBox
  • 如何在 ASP.Net Core 6 Web Api 中依赖注入 Microsoft Graph 客户端

    我正在尝试使用 ASP Net Core 6 设置 Web api 以便用户可以到达我的端点 然后我使用特权帐户在 Teams 中执行一些工作 我认为我没有正确连接 DI 部分 因为在向 Teams 发出请求时出现以下错误 MsalUiRe
  • 在 TPL Dataflow 中,是否可以在创建块之后但使用之前更改 DataflowBlockOptions?

    有效果吗 我想推迟设置 ExecutionDataflowBlockOptions SingleProducerConstrained 属性 直到我准备好将网络链接在一起 因为 我想将创建块及其语义与将网络及其语义链接在一起分开 但据我所知
  • 使用 c11 标准和 clang 来使用 strcpy_s

    我正在运行 OS X Sierra 并尝试编译一个使用的 c 程序strcpy s 但是我安装的 clang 编译器使用的是 c99 标准 但是据我读到的 https embeddedgurus com barr code 2017 08
  • ScrollableControl 在整个控件周围绘制边框

    我正在构建基于的自定义用户控件ScrollableControl 现在我正在尝试在控件周围添加边框 类似于 DataGridView 的边框 我可以使用以下方法绘制边框 e Graphics TranslateTransform AutoS
  • C# SMO 远程数据库备份到本地机器

    我有一个执行 SQL 数据库备份和恢复的应用程序 这在本地计算机上运行良好 但是如果我针对另一台计算机上托管的 SQL 服务器运行此应用程序 则会出现以下错误 Microsoft SqlServer Management Smo Faile
  • 改进绩效反思 - 我应该考虑哪些替代方案?

    我需要动态地设置对象上的一堆或属性的值 将其称为传输对象 将在短时间内创建相当数量的此类传输对象并设置其属性 我想避免使用反射 还有其他选择吗 如果是的话 有我可以查看的示例实现吗 Use Delegate CreateDelegate h
  • 从 C# 访问 COM vtable

    C 中有没有办法访问 COM 对象的虚拟方法表以获取函数的地址 经过大量搜索和拼凑不同的部分解决方案后 我弄清楚了如何做到这一点 首先 您需要为您尝试访问的对象定义 COM 组件类 ComImport Guid InterfaceType
  • 在“delete this;”语句期间发生了什么?

    请考虑以下代码 class foo public foo foo void done delete this private int x 以下两个选项中发生了什么 并且有效吗 选项1 void main foo a new foo a gt
  • FxCop 和 GAC 疯狂

    当我尝试分析依赖于模式和实践 企业库数据 以及其他 2 0 0 0 的项目时使用 FxCop FxCop 抱怨它不能 定位程序集引用 即使正在分析的应用程序 dll 是根据其编译的此版本及其在 GAC 中 如果我浏览到 GAC 尝试选择相同
  • ASP.NET MVC 中是否有嵌套母版页?

    我想知道 MVC 框架是否可以利用嵌套母版页 如果是这样 有人有一些关于如何实现这一目标的信息吗 我们经常使用嵌套母版页 以便将布局与标准包含和站点范围标记分开 如下所示 站长
  • Makefile:如何正确包含头文件及其目录?

    我有以下 makefile CC g INC DIR StdCUtil CFLAGS c Wall I INC DIR DEPS split h all Lock o DBC o Trace o o cpp DEPS CC o lt CFL
  • 检查字符串中是否存在所有字符值

    我目前正在做这项任务 但我被困住了 目标是读取文件并查找文件中的字符串中是否存在这些字符值 我必须将文件中的字符串与作为参数放入的另一个字符串进行比较 但是 只要每个字符值位于文件中的字符串中 那么它就 匹配 示例 输入和输出 a out
  • 如何声明返回相同类型的 Func Delegate 的 Func Delegate?

    我想编写一个方法 该方法可以完成一些工作 并最终返回另一个与原始方法具有相同签名的方法 这个想法是根据前一个字节值顺序处理字节流 而不进行递归 通过这样调用它 MyDelegate executeMethod handleFirstByte
  • IOS Box2D - 身体遵循基于速度波动的点数组的特定路径

    我有一个关于身体的问题 它遵循特定的路径 首先是将身体移动到目标点的方法 const float destinationControl 0 3f b2Vec2 targetPosition path counter b2Vec2 missi
  • 在 C++ 中运行 python [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一个用 C 编写的应用程序和一个测试系统 也是用 C 编写的 测试系统非常复杂并且很难改变 我只想做一些小的改变 我的班级是这样的
  • 如何获取 EF 中的实体更改增量?

    我只需要获取已更改字段的列表 数据存储区是 ssce 因此没有可用的触发器 EF 是否支持获取列表或构建通用组件 根据上下文的类型和生成的实体 您可以通过多种不同的方式来完成此操作 如果对象继承自 Entity 或 POCO 您可以使用Ob
  • 您可以从 AuthorizeAttribute 返回 HTTP 响应而不引发异常吗?

    我在各种控制器上使用 AuthorizeAttribute 可能需要根据请求本身的某些属性返回 403 或 429 请求过多 我完全在自定义 OnAuthorization 实现中实现了它 然后在必要时抛出一个带有适当响应代码的新 Http
  • 编写一个转储屏幕像素的 RDP 客户端

    我想在中实现 RDP 客户端C 它能够获取屏幕所有像素的颜色值并将它们转储到文件中 我知道这在概念上与 RDP 的工作方式不同 但我的应用程序需要它 我正在尝试利用freerdp https github com FreeRDP FreeR
  • 从 C# 应用程序调用 ASP.net Web 服务

    我有个问题 我如何调用 Web 服务并从 C 桌面应用程序获取结果 我正在制作一个桌面应用程序 我希望它能够连接到我的在线 ASP net Web 服务 这怎么可能 在 解决方案资源管理器 中 右键单击项目节点并选择 添加 Service参

随机推荐

  • Angular 2 使用 FormBuilder 访问嵌套 FormArray

    首先 我刚刚从 Angular 2 开始 我正在尝试构建一个嵌套表单并验证它 这是我的 ts 文件的一部分 ngOnInit this myForm this formBuilder group projects this formBuil
  • JavaScript 的正则表达式表示法有什么问题?

    我正在读道格拉斯 克罗克福德的网页 JavaScript 世界上最容易被误解的编程语言 我不禁注意到 在 设计错误 下 他提到了 文字正则表达式的符号 他到底在说什么 JavaScript 的正则表达式表示法有什么问题 为什么 可能与它迫使
  • 将取消引用的智能指针的地址传递给需要原始指针的函数

    假设我正在使用需要使用原始指针的库或框架 使用拥有一些数据的智能指针 然后将取消引用的智能指针的地址传递给需要原始指针的函数 这是有效的做法吗 是的 这是有效的做法 这std智能指针有一个get 成员函数正是为了这个目的 一般来说 当您通过
  • UDF 中的 COLLATE 未按预期工作

    我有一个带有文本字段的表格 我想选择文本全部大写的行 该代码按其应有的方式工作 并返回ABC SELECT txt FROM SELECT ABC AS txt UNION SELECT cdf t WHERE txt COLLATE SQ
  • 只保留字符串中的前 n 个字符?

    JavaScript 有没有办法删除字符串的末尾 我只需要保留字符串的前 8 个字符并删除其余的 const result Hiya how are you substring 0 8 console log result console
  • 在 C++ 中,有什么理由用 for(;condition;) 替换 while(condition) 吗?

    好像 while condition do stuff 完全等价于 for condition do stuff 有什么理由使用后者而不是前者 没有good据我所知原因 您使用不增加任何内容的 for 循环故意误导人们 Update 根据O
  • ASP.NET MVC 4.5.2 连接到 IdentityServer4

    我有一个在 ASP NET MVC 4 5 2 上运行的网站 我有一个 IdentityServer4 服务器正在运行 但是当我尝试对其进行身份验证时 我得到 invalid request 对于 ASP NET Core MVC文档 ha
  • 图像未在 React 中加载

    无法显示图像 出现未找到错误 但我已经提供了它的完整路径 我不知道我哪里错了 class App extends React Component render return div h1 hello h1 img src home priy
  • 我应该在配置文件之外使用 env() 吗?

    我偶然发现了这个https laravel com docs 5 4 configuration configuration caching在文档中 这让我有点困惑 当我想要一个环境变量时 我使用 env 函数返回我想要的内容 根据上面的链
  • postgres 上慢速选择不同查询

    我在一个基本上收集日志信息的表上经常执行以下两个查询 两者都从大量行中选择不同的值 但其中的不同值少于 10 个 我分析了该页面完成的两个 不同 查询 marchena gt explain select distinct auditrec
  • 如何将月份格式化为 mmm 格式?

    我正在尝试使用 VBA 在 Excel 中格式化日期 即当前月份mmm格式 不知何故 我得到的是上个月 而不是当前月份 我查了一下 我的电脑月份是二月 但我得到的是一月 这是我的代码 Cells 1 2 Format month Date
  • 为什么GCC编译的C程序需要.eh_frame部分?

    测试在 32 位 x86 Linux 上进行gcc 4 6 3 使用时gcc编译一个C程序和使用readelf要检查部分信息 我可以看到 eh frame部分和 eh frame hdr里面的部分 例如 这是二进制程序的部分信息Perlbe
  • 如何使用 System.IdentityModel.Tokens.Jwt 使用 Google OAuth2 兼容算法 RSA SHA-256 生成 JWT?

    我正在尝试创建一个 JWT 以使用服务帐户进行授权 如中所述谷歌文档 using System IdentityModel Tokens Jwt 我有以下代码 byte key Convert FromBase64String var ce
  • Android ADB 重新分发 [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 您是否可以将 Android ADB 重新分发给最终用户 安装程序中是否包含可能包含的分发 软件包 我们正在考虑使用它来在我们的 Android 应用程序和桌面应用程序之间提供 US
  • Apple 推送通知注册和设备令牌 收到说明了吗?

    我正在开发一个 iPhone 应用程序Apple Push Notification一体化 对此我有一些疑问 如果用户单击 APNS 注册警报中的 不允许 按钮 我们的代码是否仍会从 APNS 接收设备令牌 我测试过 当用户关闭iPhone
  • 如何在正在运行的 docker 容器中设置环境变量

    如果我有一个不久前启动的 docker 容器 那么在该正在运行的容器中设置环境变量的最佳方法是什么 当我运行 run 命令时 我最初设置了一个环境变量 docker run name my wordpress e VIRTUAL HOST
  • protobuf 消息是否跨版本的 protobuf 兼容

    我开始使用 protobuf 2 2 0 构建一个应用程序 因为它是最新的 现在我正在考虑升级到最新的 protobuf 2 4 0a 如果我这样做 应用程序的一个版本生成的消息是否仍然可以被同一架构的另一版本读取 或者我会破坏什么东西 那
  • 通过多个条件匹配和替换数据框的列

    干杯 我有两个具有以下结构的数据框 DF1 Airlines HeadQ Date Cost Index American PHX 07 31 2016 220 American ATL 08 31 2016 150 American AT
  • Dart/Flutter 的类似 Python 装饰器的设计模式?

    我希望在类似装饰器的功能中拥有通用的 try catch finally 逻辑 可以 包装 函数或类方法 考虑以下场景 Class MyClass void someMethodA doSomeInitialWork try doSomet
  • ASP.NET MVC(异步)CurrentCulture 不在控制器和视图之间共享

    我有一个面向 NET Framework 4 7 1 的 ASP NET MVC 4 应用程序 如果操作包含异步调用 则存在以下问题 控制器和视图之间不共享区域性 我正在引用 NuGet 包Microsoft AspNet Mvc5 2 3