web-dev-qa-db-ja.com

ASP.netでCurrentCultureが誤ってデフォルトのen-USになっています

私はちょうど約100のASP.netサイトをWindows Server 2003のIIS 6からWindows 2008のIIS 7に移行しました。 DateTime.Parseのようなものを使用するコードは、「Stringは有効なDateTimeとして認識されませんでした」というエラーを発生させ始めました。これは、サイトのCurrentCultureがデフォルトの「en-US」英国のユーザーは、予期しない形式で日付を入力しています。

質問は、どこからen-USを入手しているのですか?上から始めて、[コントロールパネル]> [地域と言語]を見ると、すべてが英語(イギリス)に設定されています。サイトのweb.configsには、<globalization>セクションがないか、<globalization culture = "auto" uiCulture = "auto" />として設定されています。 「IIS7-.Net Globalization」では、すべてのサイトのカルチャーが「Invariant Language(Invariant Country)」に設定されています。

文化を「en-US」に設定している場所はどこにもありません...しかし、何かあります。

Thread.CurrentThread.CurrentCulture.Name is outputting 'en-US'
Thread.CurrentThread.CurrentCulture.NumberFormat.CurrencySymbol is outputting '$'

この問題を解決するには、すべてのweb.configに<globalization culture = "en-GB" uiCulture = "en-GB" />を追加しますが、100個のweb.configを手作業で編集する必要はありません。 en-GBに設定されているサーバーOS設定からカルチャを継承するのは望ましくありません。

何か不足していますか?

26
Siegemos

これらは、検索可能な代替場所です。

文化を「en-US」に設定している場所はどこにもありません...しかし、何かあります。

Thread.CurrentThread.CurrentCulture.Nameは「en-US」を出力していますThread.CurrentThread.CurrentCulture.NumberFormat.CurrencySymbolは「$」を出力しています

InitializeCultureメソッドを探してみてください。このメソッドはASP.Netページでオーバーライドされ、Cultureを次のように設定します。

protected override void InitializeCulture()
{
    var hidden = this.Request.Form["hidden"];
    var culture = this.Request.Form[hidden];
    if (!string.IsNullOrWhiteSpace(culture))
    {
        this.Culture = culture;
        this.UICulture = culture;
    }

    base.InitializeCulture();
}

次のアセンブリ属性を探してみてください。

    [Assembly: AssemblyCulture("en-US")]
    [Assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.MainAssembly)]

次のページディレクティブ属性を探してみてください。

    <%@ Page Culture="en-US" UICulture="en-US" Title="" Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true" CodeFile="Default2.aspx.cs" Inherits="Default2" %>

Web.configsを確認してください。

<globalization uiCulture="en-US" culture="en-US" enableClientBasedCulture="false" />

編集1

言語を設定しようとするHttpHandlersまたはHttpModulesを探してみてください

Web.config階層(サーバーで、<wwwroot>は、IIS Webサイト)のルートフォルダを意味します

  1. グローバルマシン。 <windir>\Microsoft.NET\Framework\<ver>\Config\Machine.config
  2. ルートWeb設定。 <windir>\Microsoft.NET\Framework\<ver>\Config\Web.config
  3. ウェブサイト。 <wwwroot>\Web.config
  4. ウェブアプリケーション。 <wwwroot>\<webapp>\Web.config
  5. フォルダ。 <wwwroot>\<webapp>\<dir>\Web.config

複数のサーバー(Webファーム)がある場合、正しいサーバー(構成を確認しているサーバー)にリダイレクトされていることを確認します。これを行うには、目的のサーバーのIPを使用するか、クライアントコンピューター

26
Jupaol

ルートweb.config(windir\Microsoft.NET\Framework\ver\Config\Web.config)にグローバリゼーションセクションを追加し、en-GBに設定すると、問題が解決し、他のサイトに伝播します。どの問題が私の問題を解決しますか。ただし、デフォルトでen-USを取得する場所についてはまだ説明していませんが、うまくいくはずです。ありがとう。

4
Siegemos

私は同じ問題を抱えていて、何時間も後に地域の設定が正しいにもかかわらず、all予約済みアカウント(ASP.NETなど)の元のカルチャを変更する必要があることがわかりました。

これは、Regional SettingsAdministrativeタブの下にあるボタン "Copy Settings ..."を使用して行います。チェックボックス「ようこそ画面とシステムアカウント」を有効にすると、設定がコピーされます。

4
SocratesG

アプリケーションプールまたはWebアプリケーションの実行に使用されるシステムアカウントのカルチャから取得できます。

このリンクを確認してください: IISとASP.NETの間の異なるカルチャ設定

2
krlzlx

.Net Webアプリケーションは、ブラウザーのデフォルトカルチャを取得しています。例えばFFでは、デフォルトの言語は次の図に示すように設定されます。 FF settings for Language

そのため、ブラウザのサイトカルチャー以外のサイトカルチャーが必要な場合は、ページのInitializeCultureメソッドで(BasePageを作成し、ここにコードを保持し、このBasePageから既存のページを継承します)。

protected override void InitializeCulture()
    {
            System.Threading.Thread.CurrentThread.CurrentUICulture = System.Globalization.CultureInfo.GetCultureInfo("en-GB");
        System.Threading.Thread.CurrentThread.CurrentCulture = System.Threading.Thread.CurrentThread.CurrentUICulture;

            base.InitializeCulture();
        }
    }
2
Nirav Vyas

私の場合、アプリケーションプールはドメインユーザーとして実行されており、現在のカルチャがen-GBに設定されており、アプリケーションはen-GB日付形式で正常に機能しました。

代わりにネットワークサービスで実行するようにアプリプールを変更しましたが、アプリが現在en-USカルチャを使用しているため、DateTime.Parse呼び出しが突然中断していました。 SO投稿( e.g )がIIS文化はユーザー固有であり、それを説明しています。

IIS Managerでルート要素の.NETグローバリゼーションを開き、CultureとUI Cultureの両方を英国英語(en-GB)に設定すると、修正されました。

1
demoncodemonkey

誰かが同じ問題を抱えるのを助けるためだけに....

変更を試みた後IIS Culture、グローバリゼーションを設定し、これまでのところ不必要に、私はGlobal.asaxでそれをしました:

void Application_BeginRequest(Object sender, EventArgs e)
{
    System.Globalization.CultureInfo newCulture = (System.Globalization.CultureInfo)System.Threading.Thread.CurrentThread.CurrentCulture.Clone();

    newCulture.DateTimeFormat.ShortDatePattern = "dd/MM/yyyy";
    newCulture.DateTimeFormat.DateSeparator = "/";

    System.Threading.Thread.CurrentThread.CurrentCulture = newCulture;
} 
0
Caio

私は自分のケースの解決策を見つけるために何時間も費やしました。 Win10(英語版)で作業していますが、ロシアの地域設定を使用しています。それにもかかわらず、IIS with ApplicationPoolIdentityでホストされているアプリで「en-US」文化を取得しました。これで問題が解決しました。

IIS -> Application Pools -> Advanced Settings -> Change "Load User Profile" to False

0
Anton Polkanov