0

我有一个使用一组 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;

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

4

1 回答 1

2

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

它将影响当前线程服务的所有请求(直到其他东西改变了属性)。但是它不会影响其他线程服务的请求。

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

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

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

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

于 2013-11-01T10:15:06.853 回答