Невозможно изменить Культуру в 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");
}
}