Почему я получаю: "Культура не поддерживается" и "Что, если что-нибудь, что я должен делать?"
У меня есть точка останова на строке "return" здесь:
[HttpGet]
[Route("api/Test/{id1}/{id2}")]
public NRBQEntity GetTestMessage(String id1, String id2)
{
return NRBQClient.GetTestMessage(id1, id2);
}
Хотя это не сбой приложения, когда я дойду до этой точки, я получаю
"Исключение: Брошено:" Культура не поддерживается. "(System.Globalization.CultureNotFoundException)
Исключение System.Globalization.CultureNotFoundException: "Культура не поддерживается". "
Какая культура пытается быть поддержана, почему она не поддерживается, и что, если что-нибудь, я должен сделать, чтобы поддержать культуру?
UPDATE
Отвечайте на sphanley:
Кроме того, чтобы стоять за "Новые райдеры BarbeQue", это "скелет" (на данный момент) Entity, который выглядит так:
public class NRBQEntity
{
public NRBQEntity()
{
}
public String Value { get; set; }
}
ОБНОВЛЕНИЕ 2
Ответ другому пользователю:
Это не мой код, поэтому я просто пытаюсь его проверить; он был предоставлен в качестве отправной точки для меня, чтобы скопировать/реорганизовать существующий автономный проект, включив его в "решение". Это, как было сказано, чтобы ответить на ваш вопрос, вот все примеры "GetTestMessage()" в решении:
[HttpGet]
[Route("api/Test/{id1}/{id2}")]
public NRBQEntity GetTestMessage(String id1, String id2)
{
return NRBQClient.GetTestMessage(id1, id2);
}
[HttpGet]
[Route("api/Test/{id1}/{id2}")]
public NRBQEntity GetTestMessage(String id1, String id2)
{
return NRBQService.GetNRBQEntity(id1, id2);
}
public interface INRBQClient
{
NRBQEntity GetTestMessage(String id1, String id2);
}
public NRBQEntity GetTestMessage(String id1, String id2)
{
var res = RESTAPIClient.GET<NRBQEntity>(null
, new Uri(NRBQClientSettings.NRBQAPI)
, String.Format("api/Test/{0}/{1}"
, id1
, id2)
);
if (res.status != RequestResultStatus.Success)
{
throw new Exception(res.message);
}
return res.result;
}
... и этот тест:
[TestFixture, Category(DRBCOMMON.UnitTests.Categories.IntegrationTest)]
public class NRBQClientIntegrationTests
{
[Test]
public void TestNRBQInterface()
{
var NRBQClient = IOC.container.Resolve<INRBQClient>();
var s = NRBQClient.GetTestMessage("GET", "SORTY");
Assert.Greater(s.Value.Length, 0);
}
}
Ответы
Ответ 1
Какая культура пытается поддерживать
Поместите try/catch вокруг строки нарушения и поймайте исключение. Поместите точку останова внутри блока catch и отлаживайте код. Изучите свойство свойства CultureNotFoundException InvalidCultureName
. Это скажет вам, какая культура пытается использовать, но не найдена в системе.
Почему он не поддерживается
В Windows есть встроенный набор культур (Какие культуры поддерживаются классом CultureInfo в .NET 3.5? и http://msdn.microsoft.com/en-us/goglobal/bb896001.aspx). Если Культура, указанная в InvalidCultureName
, отсутствует в списке, она не поддерживается.
Что, если что-нибудь, я должен сделать, чтобы поддержать культуру?
Это зависит от того, что InvalidCultureName
. Если вы законно пытаетесь использовать не поддерживаемую культуру (например, у вас есть многоязычный/многорегиональный сайт и вы хотите поддерживать английский язык для каждой культуры), у вас может быть законная необходимость создать новую культуру. Например, я работал на сайте http://www.oneill.com, где мы хотели иметь французскую версию сайта Нидерландов (http://www.oneill.com/nl-fr). Мы должны были создать новую культуру и установить ее на веб-сервере, используя следующие инструкции: http://msdn.microsoft.com/en-us/library/ms172469(v=vs.90).aspx
Если вы не занимаетесь какой-либо причудливой культурой, есть некоторые известные проблемы с asp.net, которые включают фреймворк, ошибочно создающий экземпляры CultureInfo
на основе каталогов, которые могут отсутствовать:
В этом случае похоже, что решение состоит в том, чтобы просто отключить Exception и игнорировать его.
Ответ 2
Вы можете проверить все существующие коды в этом списке.
Вы можете создать пользовательскую культуру, например:
// Create a new colture, with the name you desire
CultureAndRegionInfoBuilder cib = new CultureAndRegionInfoBuilder("en-IN", CultureAndRegionModifiers.None);
// Load all defaults from en-US
CultureInfo ci = new CultureInfo("en-US");
cib.LoadDataFromCultureInfo(ci);
// Populate the new CultureAndRegionInfoBuilder object with region information.
RegionInfo ri = new RegionInfo("US");
cib.LoadDataFromRegionInfo(ri);
// Now you can make changes, or finish.
// Changes can be currency, RegionName, etc.
// Finish
cib.Register();
в этой статье объясняется, как это сделать.