gpt4 book ai didi

c# - 使用 OWIN 和异步方法的多语言网站

转载 作者:可可西里 更新时间:2023-11-01 08:27:24 25 4
gpt4 key购买 nike

背景

我正在使用 ASP.NET 4.6、C#、IIS 上的 OWIN 管道 (Microsoft.Owin.Host.SystemWeb) 创建一个简单的多语言网站,大量异步方法调用和标准、全局资源文件(App_GlobalResources 中的*.resx)。该网站使用 MVC5、WebAPI2 和 Autofac 作为依赖解析器。

问题

我无法正确更改生成页面的语言环境/区域性,因为异步方法对每个请求使用多个线程,而且我找不到设置 Thread.Current[UI]Culture与给定请求关联的每个线程,因为这些属性不同步。我还希望保持干净的代码,不要让“异步/等待文化配置”弄乱有用的代码。

代码

启动.cs

public void Configuration(IAppBuilder app)
{
...

app.UseAutofacMiddleware(container);
app.UseAutofacMvc();
app.UseAutofacWebApi(httpConfiguration);
app.UseWebApi(httpConfiguration);

...

app.Use(async (ctx, next) =>
{
/* in production, detect based on current URL and/or cookie */
var culture = new CultureInfo("pl_PL");

CultureInfo.CurrentCulture = CultureInfo.CurrentUICulture = culture;

await next.Invoke();
});
}

示例 Controller .cs

public async Task<ActionResult> SayHello()
{
// returns pl_PL message
var msgA = Resources.Messages.HelloWorld;

await someService.doSthAsync();

// returns system default (en_US) message
var msgB = Resources.Messages.HelloWorld;

return Content(msgA + " - " + msgB);
}

  1. 我是否应该按照建议创建自定义 [AspNet]SynchronizationContext in this SO answer ?如果是这样,我应该怎么做?
  2. 我是否应该放弃将全局资源作为翻译来源并使用其他方法?如果可以,我可以使用什么(图书馆?)?

最佳答案

使用 the Owing Globalization Library 怎么样? ,它似乎就是为此目的而创建的。

您仍然可以使用您的 resx 来本地化您的资源,并且它具有强大的自定义功能:

public void Configuration(IAppBuilder app)
{
...
app.UseGlobalization(new OwinGlobalizationOptions("en-US",true)
.DisablePaths("Content", "bundles")
.Add("fr-FR", true).AddCustomSeeker(new CultureFromPreferences()));
}

我已经测试了 async/await 的使用并且保留了文化:

    public async Task<ActionResult> About()
{
var msgA = Resources.Resources.About;

await Task.Delay(1000);

var msgB = Resources.Resources.About;

ViewBag.Message = msgA + " - " + msgB;

return View();
}

注意:我不是这个库的作者,我之前正好用过。

关于c# - 使用 OWIN 和异步方法的多语言网站,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32128751/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com