无法在WCF中更改文化

时间:2012-05-24 00:31:08

标签: wcf iis-7 web-config

我在Windows 2008服务器上运行。我有一个调用wcf服务的Web服务。 在WCF服务中,它会尝试投放20/08/2010的日期,因为它认为它是美国格式而不是澳大利亚语。

到目前为止,我有:

  • 在控制台上,将格式为
  • 的区域更改为英语澳大利亚语
  • 在“管理”标签下,我还将系统本地设置为英语(Austrlian)
  • 在IIS7中的默认网站级别我已经改变了.Net全球化下的文化和UI文化。
  • 我也在Web服务和WCF节点上完成了这项工作

我已将以下内容添加到Web服务和WCF应用程序web.config文件

<globalization requestEncoding="utf-8" 
               responseEncoding="utf-8"  
               culture="en-AU" 
               uiCulture="en-AU" />

这最终改变了Web服务的文化,但WCF服务仍然是美国文化。

有谁能告诉我还能尝试什么?

3 个答案:

答案 0 :(得分:7)

如果您未设置aspNet兼容性,WCF将忽略您的全球化配置:

<system.serviceModel>    
   <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
...

要使用该模式,您的服务类必须将AspNetCompatibilityRequirements属性设置为Allowed或Required:

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class ServiceClass
{
...
}

如果您想从配置文件中应用Culture和CultureUI,这可能会有效。

或者您可以尝试在WCF服务代码中强制使用Culture,如果您确定它不会动态更改。例如,在您的服务类构造函数中。请注意,这不是最佳实践,也许您应该使用Context初始化程序,但这个很简单。

public ServiceClass()
{
    ...
    System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo("en-AU");
    System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-AU");
}

更多信息:

setting-cultureinfo-on-wcf-service-calls

using-call-context-initializers-for-culture

答案 1 :(得分:2)

问题在于为应用程序池中使用的用户设置的文化。

我找到了以下解决此问题的方法:

  1. 如果应用程序池使用ApplicationPoolIdentity将其更改为NETWORKSERVICE(不幸的是我没有找到如何为ApplicationPoolIdentity设置区域设置)
  2. 在当前用户上设置您需要的区域设置(en-AU),然后按照here所述为系统帐户复制它们。

答案 2 :(得分:0)

您可以在Global.asax.cs文件的Application_Start文件中执行此操作:

using System.Threading;
using System.Globalization;

public class Global : HttpApplication
{
    protected void Application_Start(object sender, EventArgs e)
    {
        CultureInfo.DefaultThreadCurrentCulture = CultureInfo.DefaultThreadCurrentUICulture = new CultureInfo("en-AU");
    }
}