読者です 読者をやめる 読者になる 読者になる

clock-up-blog

go-mi-tech

ASP.NET MVC 例外メッセージをすべて英語にする

ASP.NET .NET C#

(If you prefer English than Japanese, you can see English article.)

ASP.NET MVC で例外が発生したときに表示されるエラーメッセージをすべて英語にする。

方法

端的にいうと以下の2行を加えるだけで良い。

Global.asax.cs

....
using System.Globalization;
....
namespace WebApplication1
{
    public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("en-US"); // Add
            CultureInfo.DefaultThreadCurrentUICulture = new CultureInfo("en-US"); // Add
....

サンプルエラー画面

今回示すエラーは Twitter 認証を適当に入れて意図的に出したエラーである。

app.UseTwitterAuthentication(
  consumerKey: "a",
  consumerSecret: "b");

今回の対処を入れない場合、日本語環境であれば当然エラーメッセージに日本語が混じる。
f:id:kobake:20160819013020p:plain:w600

今回の対応により英語表示にしたエラー画面

CultureInfo.DefaultThreadCurrentCulture, CultureInfo.DefaultThreadCurrentUICulture を設定することにより、エラーメッセージが完全に英語になった。
f:id:kobake:20160819013031p:plain:w600

不完全な対応の紹介

Web.config による対応(不完全)

Web.config をいじるのは作法としては順当である。

....
<system.web>
  ....
  <globalization
    requestEncoding="utf-8"
    responseEncoding="utf-8"
    fileEncoding="utf-8"
    culture="en-US"
    uiCulture="en-US" />
</system.web>
....

が、実はこれだと微妙~に一部例外のメッセージ部分に日本語が残る場合がある。
f:id:kobake:20160819013042p:plain:w600

CurrentThread をいじる方法(意味がない)

一応参考までに書いておくが、CurrentThread をいじるのは意味がない。スレッドは複数立ち上がるものだから。

Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");

おわり

CultureInfo.DefaultThreadCurrentCulture, CultureInfo.DefaultThreadCurrentUICulture を設定する方法は ASP.NET MVC 以外の .NET Framework アプリでも通用する方法かと思うので覚えておいて損はない。と思う。

さいごに:なぜ英語にするのか

日本語での技術情報が少ない。すなわち日本語エラーメッセージのググラビリティが低い。これに尽きる。

});