Измените культуру для сообщений HttpResponse и исключений в Asp.Net

#c# #asp.net-core #localization #dotnet-httpclient #cultureinfo

Вопрос:

Я пытаюсь разместить все сообщения об ошибках и ответы в ASP.Сетевое приложение на английском языке. Это то, что я пробовал (в начале метода настройки):

         CultureInfo.CurrentCulture = CultureInfo.CreateSpecificCulture("en-US");
        CultureInfo.CurrentUICulture = CultureInfo.CurrentCulture;
        CultureInfo.DefaultThreadCurrentCulture = CultureInfo.CurrentCulture;
        CultureInfo.DefaultThreadCurrentUICulture = CultureInfo.CurrentCulture;
        System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.CurrentCulture;
        System.Threading.Thread.CurrentThread.CurrentUICulture = CultureInfo.CurrentCulture;

        var supportedCultures = new[] { "en-US" };
        var localizationOptions = new RequestLocalizationOptions()
            .SetDefaultCulture(supportedCultures[0])
            .AddSupportedCultures(supportedCultures)
            .AddSupportedUICultures(supportedCultures);
        localizationOptions.DefaultRequestCulture = new RequestCulture(supportedCultures[0]);

        app.UseRequestLocalization(localizationOptions);
 

Вот сообщение об исключении, которое я получаю обратно (я использую Flulrl, но использование HttpClient дает те же результаты):

 resp = await _flurlClient
                .Request("Accounts", "Login")
                .PostJsonAsync(loginModel);

Call failed. Impossibile stabilire la connessione. Rifiuto persistente del computer di destinazione. (localhost:5001)...
 

Я пробовал размещать как на Kestrel, так и на IIS Express, ничего не изменилось.
Чего мне не хватает?

Комментарии:

1. неужели ты забыл добавить services.AddLocalization(); ?

2. @GordonKhanhNg. Я пытался это сделать, но не помог. Я не пытаюсь предоставить свои собственные локализации. Я просто хотел бы получить ошибки по умолчанию, как если бы у меня была английская локализованная операционная система. Возможно ли это?

3. о-о-о… я присмотрелся и кое-что заметил… но это совершенно не соответствует комментарию здесь… так что взгляните на ответ

Ответ №1:

Вы пропускаете 2 части:

  • Добавьте services.AddLocalization(); , это зарегистрирует IStringLocalizerFactory и общий IStringLocalizer для вас
  • app.UseRequestLocalization воспользуйтесь тем IOptions<RequestLocalizationOptions> , чего вам сейчас тоже не хватает.

Таким образом, код должен быть:

 // Registering things
services.AddLocalization();

var supportedCultures = new[]
    {
        new CultureInfo("en-US")
    };

services.Configure<RequestLocalizationOptions>(opts =>
    {
        opts.DefaultRequestCulture = new RequestCulture("en-US");
        opts.SupportedCultures = supportedCultures;
        opts.SupportedUICultures = supportedCultures;

        opts.AddInitialRequestCultureProvider(new CustomRequestCultureProvider(context =>
        Task.FromResult(new ProviderCultureResult("en-US"))));
    });

// Using things
app.UseRequestLocalization();
 

Примечание: Поскольку вы хотите вернуть только английскую локализацию в качестве примера, я только что настроил конфигурацию, чтобы установить «en-US», это был бы ваш единственный выбор. Если вам нужна истинная локализация, используйте свою собственную логику в var supportedCultures и opts.AddInitialRequestCultureProvider

Комментарии:

1. SupportedCultures хочет, чтобы CultureInfos не был строками, кроме того, он должен работать. Я проверю это снова завтра и дам вам знать. Спасибо ;D

2. хорошая мысль… я просто копирую эту часть из вашего кода (XD)… просто исправил только эту часть. Имейте веру, мой друг

3. Я попробовал еще раз, но это не сработало. Я получаю эту ошибку: System.Net.Http.HttpRequestException: Impossibile stabilire la connessione. Rifiuto persistente del computer di destinazione. (localhost:4545) ---> System.Net.Sockets.SocketException (10061): Impossibile stabilire la connessione. Rifiuto persistente del computer di destinazione.

4. Вот что я делаю с HttpClient: await _client.GetAsync("https://localhost:4545/test"); URL-адрес является поддельным. Я не знаю, что происходит, я думал, что это работает, но сейчас это не так… Я пробовал как IIS Express, так и Kestrel

5. Impossibile stabilire la connessione это исключение указывает на то, что httpClient невозможно вызвать сервер (запрос не может быть сделан на сервер). Это не связано с локализатором. Кстати… вот как строится мой проект … работает как заклинание