更改Web服务中的CurrentUICulture是否会影响所有用户?

时间:2013-11-01 08:48:20

标签: c# asp.net web-services cultureinfo

我有一个使用一组Web服务的Web应用程序。当在Web服务上捕获异常并将其发送回客户端时,我需要使用当前在Web应用程序上设置的语言显示该消息。

我的第一个想法是发送一个包含Web应用程序的CurrentUICulture的SoapHeader,并改变这样的文化:

CultureInfo culture;
culture = CultureInfo.CreateSpecificCulture(CultureHeader.currentCulture);
System.Threading.Thread.CurrentThread.CurrentCulture = culture;
System.Threading.Thread.CurrentThread.CurrentUICulture = culture;

我现在想知道这是否会影响网络服务的所有用户或仅影响当前的请求?

1 个答案:

答案 0 :(得分:2)

  

我现在想知道这是否会影响网络服务的所有用户或仅影响当前的请求?

它将影响当前线程所服务的所有请求(直到其他内容更改属性)。但是,它不会影响其他线程提供服务的请求。

记住ASP.NET使用一个线程池来允许同时为多个请求提供服务,但是在调试时,您通常一次只处理一个请求,所以这不是很明显。

当然,如果您正在使用ASP.NET的异步支持,允许不同的池线程启动服务请求并启动异步操作,但是当这些异步操作完成时,再次使用线程池有时会导致不同的线程完成如果一个线程有一个文化集而另一个线程有不同的线程,那么操作就会变得有趣。

总结:好的做法是永远不要依赖当前线程上设置的隐式语言环境:所有与文化相关的操作(包括所有调用,直接或间接,到ToString)都应该明确传递正确的文化。

更好的是明确决定并使用特定格式(例如,ISO-8601中的所有日期和时间),对于文化产生影响的每种数据类型,客户不需要处理猜测正确的解释(例如,有些人认为今天不是2013年1月11日。