Невозможно изменить Культуру в WCF

Я работаю на сервере Windows 2008. У меня есть один веб-сервис, который вызывает службу wcf. В рамках службы WCF он пытается указать дату 20/08/2010, которая терпит неудачу, потому что она считает это в формате США не австрийским.

До сих пор я:

  • На панели управления измените регион на английский австралийский язык в формате
  • На вкладке "Администратор" я также установил локальную систему на английский (австрийский)
  • в IIS7 на уровне веб-сайта по умолчанию. Я изменил культуру и пользовательский интерфейс в рамках .Net-глобализации.
  • Я также сделал это в веб-службе и узлах WCF

Я добавил следующее к веб-сервису и приложениям WCF. Файл web.config

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

Это окончательно изменило культуру в веб-службе, но служба WCF остается культурой США.

Может ли кто-нибудь сказать мне, что еще я могу попробовать?

Ответ 1

WCF будет игнорировать вашу настройку глобализации, если вы не установите совместимость aspNet:

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

Чтобы использовать этот режим, ваш класс службы должен иметь атрибут AspNetCompatibilityRequirements, установленный как "Разрешено" или "Требуется":

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

Это может работать, если вы хотите применить Культуру и CultureUI из файла конфигурации.

Или вы можете попытаться заставить Культуру в вашем сервисном коде WCF, если вы уверены, что она не изменится динамически. Например, в вашем конструкторе класса обслуживания. Обратите внимание, что это не лучшая практика, возможно, вы должны использовать инициализатор контекста, но это довольно просто.

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

Ответ 2

Проблема заключается в культуре, заданной для пользователя, используемого в пуле приложений.

Я нашел следующий способ решить эту проблему:

  • Если пулы приложений используют ApplicationPoolIdentity, измените его на NETWORKSERVICE (к сожалению, я не нашел, как установить региональные настройки для ApplicationPoolIdentity)
  • Задайте региональные настройки, которые вам нужны (en-AU) для текущего пользователя, и скопируйте их для системных учетных записей, как описано здесь.

Ответ 3

Вы можете сделать это в файле 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");
    }
}