【问题标题】:Localization for async calls in ASP.NET WebApiASP.NET WebApi 中异步调用的本地化
【发布时间】:2012-12-31 08:46:26
【问题描述】:

嗨——我计划根据“Accept-Language”标头处理服务器端本地化的错误字符串等,方法是根据该标头设置 CurrentUICulture,但显然它不会通过异步调用,下面是一个示例代码来说明问题,是否有任何默认方式来处理异步调用的本地化?

   public async Task<HttpResponseMessage> GetAsync()
    {            
        //set the current ui culture, to say "fr-FR", based on "Accept-Language" header
        Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("**fr-FR**");  

       var task = httpClient.PutAsync(endpoint, content)            

        //do some processing

        var res  = await task;

        var culture = Thread.CurrentThread.CurrentUICulture.Name; **//ITS NOT necessarily fr-FR**

        //do some more processing
        //and handle localizations etc.

        return res;
    }

我正在寻找一种更清洁/无缝的方式来处理本地化,以应对存在真正异步操作的情况,尤其是。对于等待调用之后的代码

编辑:为清楚起见,将 Task.Run() 替换为 httpClient.PutAsync

【问题讨论】:

    标签: asp.net asynchronous asp.net-web-api


    【解决方案1】:

    Task.Run 和 Task.Factory.StartNew 没有任何上下文。这是预期的行为。当您使用 await 关键字时,上下文会被保留。所以你可以这样做:

    public static async Task<IEnumerable<string>> GetAsync()
    {            
        //set the current ui culture, to say "fr-FR", based on "Accept-Language" header
        Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("fr-FR");
    
        //do some processing
    
        var s = await GetSomething();
    
        var culture = Thread.CurrentThread.CurrentUICulture.Name; //It's ja-JP
    
        return new[] { s, s };
    }
    
    public static Task<string> GetSomething()
    {
        var cuture = Thread.CurrentThread.CurrentUICulture.Name; // It's fr-FR
        var tcs = new TaskCompletionSource<string>();
        Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("ja-JP");
        tcs.SetResult("<something>");
        return tcs.Task;
    }
    

    【讨论】:

    • 不能保证这 3 个部分(1. GetSomething() 调用 2. 之前的代码和 3. 之后的代码)可能会在 3 个不同的 asp.net 线程上运行,尤其是。如果 GetSomething() 是一个长时间运行的异步操作。
    • 如果您使用我示例中的代码,它们将在相同的上下文中运行。如果您使用 Task.Run 或 Task.Factory.StartNew 创建任务,则不能保证它们在同一线程上运行。
    • 我正在寻找一种更干净/无缝的方式来处理本地化,以处理存在真正异步操作(例如调用另一个 Web 服务等)的情况,默认情况下,这种情况下的上下文不会相同.
    • 是的,但是当它返回时,剩余部分可能会在第三个线程上执行,而不必在原始线程上执行
    • 问题中给出的示例设置了当前的ui文化,比如说“fr-FR”,基于await调用之前的“Accept-Language”标头,一种方法是我们可以设置当前的ui每次等待呼叫后再次文化,说“fr-FR”,基于“Accept-Language”标题。问题是这是否可以以无缝的方式完成,看起来这是不可能的。无论如何,感谢达林的及时回复。
    猜你喜欢
    • 1970-01-01
    • 2013-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多