WebSurfer's Home

Filter by APML

DataWeb 新サーバー移行

by WebSurfer 11. December 2024 17:37

先の記事「MariaDB 10.11 をインストールしました」で書きましたように、2024 年 12 月にこのブログで使っているホスティングサービスで新サーバーへの移行がありました。新サーバーでは MariaDB 10.11 が使用されており、それに自分がブログアプリで使っていたプロバイダ MySql.Data 6.3.6 でアクセスするとサーバーエラーになるという問題が生じました。

対応するには、プロバイダに MySql.Data 8.1.0 以降もしくは MySqlConnector を使えば良さそうだということは分かりましたが、いずれも .NET Framework 3.5 には対応しておらず、アプリのフレームワークを .NET Framework 4.6.2 以降にしなければなりません。

という訳で、既存の ASP.NET Web Forms アプリの Web サイトプロジェクトを開発環境で .NET Framework 4.8.1 で作り直し、それをホスティングサービスのサーバーにアップロードし、ホスティングサービスの Plesk コントロールパネルを使って既存のサイト/アプリケーションと置き換える作業を行いました。以下にどのように行ったかを備忘録として書いておきます。

既存の ASP.NET Web Forms アプリをどのように .NET Framework 4.8.1 で作り直したかの詳細は割愛しますが、一点だけプロバイダをどうしたかだけ書いておきます。

MySql.Data 8.1.0 以降であれば問題はないことは確認できたのですが、データベースが MySQL から MariaDB に変更されているので Oracle 製の MySql.Data を使うのはこの際やめて、MariaDB と相性が良さそうで、かつ性能もよさそうな MySqlConnector に変更することにしました。

MySqlConnector と MySql.Data の比較について、詳しくは記事 MySqlConnector vs MySql.Data を見てください。

ADO.NET で使うのに、MySql.Data と同じ名前の MySqlConnection, MySqlCommand などが使用できるところも良いと思います。この記事を書いた時点での最新版 MySqlConnector 2.4.0 を NuGet からインストールしました。

以下に、Plesk コントロールパネルを使って、どのように自分の PC からアプリをサーバーにアップロードしたか、既存のサイトをどのように置き換えたか、既存のアプリケーションをどのように置き換えたかを書きます。

(1) サーバーへのアップロード

自分の PC では、Visual Studio 2022 を使って、下の画像の通りのフォルダ構成でアプリケーションのソリューション / プロジェクトを作成しました。画像で赤枠で囲ったフォルダをサーバーにアップロードします。

自分の PC のフォルダ構成

Plesk コントロールパネルにアクセスします。「ウェブサイトとドメイン」で「ダッシュボード」タブを選択。[ファイル] をクリック。表示された「ファイルマネージャ」画面で [ホームディレクトリ] をクリック。+ のアイコンをクリックして [ディレクトリをアップロード] を選択します。

ディレクトリのアップロード

[ディレクトリをアップロード] 選択で表示された画面に自分の PC のエクスプローラーからアップロードするディレクトリをドラッグ&ドロップするとアップロードが始まります。

アップロードするフォルダ内に ,vs フォルダが含まれているとアップロードに失敗します (.suo ファイルが問題らしい)。一時削除してからアップロードすれば問題なかったです。

1 ファイル当たり 1 秒ほどかかりますのでファイルの数が多いとかなり時間がかかります。FTP を使った方が早いかもしれません (未検証・未確認ですが)。

MyHomePageNet48, BlogEngineNet48, BlogEngine2Net48 全てのフォルダのアップロードが完了すると以下の画像のようになります。赤枠で示したフォルダがサーバーにアップロードされたフォルダです。

アップロードされたフォルダ

(2) 既存のサイトの置き換え

サイトのフォルダはデフォルトで httpdocs に設定されていますが、コントロールパネル上で任意のフォルダに変更する事が可能です。

まず、「ウェブサイトとドメイン」 で「ホスティングと DNS」タブを選択し[ホスティング]をクリックします。「ホスティング設定」画面が表示されます。

ホスティング設定

その中の[ホスティングタイプ]の[ドキュメントルート]に、上の手順 (1) でアップロードしたホルダの中でサイトに該当する MyHomePageNet48 を設定し、[保存]ボタンをクリックします。

「ダッシュボード」タブをクリックし「開発ツール」の[ASP.NET 設定]をクリックします。表示された画面で [フレームワークバージョン] を 4.8.1 に設定します。

フレームワークバージョンの設定

以上で MyHomePageNet48 はサイトとして動くようになりました。

(3) 既存のアプリケーションの置き換え

ホスティングサービス会社のナレッジベース「[DataWeb] 仮想ディレクトリの作成とアプリケーション化について」を参考に、BlogEngineNet48 と BlogEngine2Net48 を上の手順 (1) で作成したサイト下のアプリケーションに設定します。

まず既存のアプリケーション名を変更します。[ダッシュボード]タブをクリックし「ファイルとデータベース」から[仮想ディレクトリ]をクリックします。表示された一覧の中の既存のアプリケーション (この記事の例では blogengine と blogengine2) の[設定の編集]をクリックします。

アプリケーションの設定の編集

[仮想ディレクトリのプロパティ]画面で[名前]を変更します。この記事の例では BlogEngine を oldBlogEngine に変更しています。BlogEngine2 の方も同様にして oldBlogEngine2 に名前を変更します。

アプリケーション名の変更

blogengine と blogengine2 はアプリケーションのエイリアスです。なので、新しいフォルダ BlogEngineNet48 を blogengine、BlogEngine2Net48 を blogengine2 というエイリアスのアプリケーションとして設定しなければなりません。そのために上に述べた名前の変更は必須です。

次にアップロードした BlogEngineNet48 と BlogEngine2Net48 をアプリケーションに設定します。

「ファイルとデータベース」から[仮想ディレクトリ]をクリックして表示される画面で[仮想ディレクトリを作成]ボタンをクリックします。

表示された「仮想ディレクトリを作成」画面で[仮想ディレクトリ]の[名前]にアプリケーションのエイリアス (この記事の例では blogengine または blogengine2) を入力し、[パス」にアップロードしたディレクトリへのパス (この記事の例では BlogEngineNet48 または BlogEngine2Net48) を設定します。

「アプリケーション設定」の[アプリケーションの作成]にチェックが入ってなかったら入れてください。

[Save]をクリックすると上で設定した名前でアプリケーションが追加されます。

アプリケーション追加

追加されたアプリケーションをクリックし、表示された設定画面で[ASP.NET]をクリックします。

ASP.NET 設定

「ASP.NET 設定の構成」画面が表示されるので、フレームワークバージョンを 4.8.1 に設定します。

フレームワークバージョンの設定

以上を BlogEngineNet48 と BlogEngine2Net48 に対して行って、上の手順 (2) で設定したサイト下のアプリケーションとして動くようになりました。

Tags: , , , ,

BlogEngine.NET 2.0

ページャーの設定変更

by WebSurfer 21. September 2015 13:04

記事数が増えてきて、画面の下の方に表示されるページャーの表示が下の画像のように崩れるので、設定を変更しました。どのように変更したかを備忘録として書いておきます。

ページャー

具体的にはページャーに表示されるページの数を減らしました(上の画像で言うと、99 と 107 の 2 つを減らしました)。

その数字は App_Code/Controls/PostPager.cs で MaxPages = 12 としてハードコーディングされており、それを 10 に変更しました。

変更は以下のコードに示すように 1 行だけで済みます。ただし、該当箇所を探すのと、ソースを修正してサーバーの PostPager.cs と差し替えなければならないのがちょっと面倒かも。

private static IEnumerable<int> PageList(int total, int current)
{
    var pages = new List<int>();
    var midStack = new List<int>();
            
    // should be more then 4
    // 2015/9/21 記事数が増えページャーの幅が広がって表示が
    // 崩れるので初期値 12 を 10 に変更。
    const int MaxPages = 10;

    if (MaxPages > total)
    {
        for (var i = 1; i <= total; i++)
        {
            pages.Add(i);
        }
    }
    else
    {
        const int Midle = (MaxPages - 4) / 2;

        // always show first two
        pages.Add(1);
        pages.Add(2);

        // ・・・中略・・・

        // always show last two
        pages.Add(total - 1);
        pages.Add(total);
    }

    return pages;
}

なお、ブログ1(BlogEngine.NET 1.6.1 を使用)のページャーも ページャーの移植 で書きましたようにページャーだけブログ2のものに差し替えており、それもついでに変更しました。

Tags:

BlogEngine.NET 2.0

国際化の不具合の修正

by WebSurfer 6. September 2015 15:06

約 2 年ぶりの BlogEngine.NET 2.0 の不具合修正の話です。

BlogEngine は国際化対応がされていて、ブラウザの言語指定に応じてリソースファイルの自動切り替えが行われ、ラベルに表示される文字列の言語が変わります。

例えばブラウザが IE の場合、言語の優先順位の設定を下の画像のように日本語を最優先にしておくと、アプリケーションルート直下の App_GlobalResources フォルダにある日本語のリソースファイル labels.ja.resx からラベルに表示する文字列を取得して設定します。

IE の言語の優先順位の設定

(詳しい仕組みに興味がありましたら、別の記事 aspx ページでのリソースの利用 を見てください)

ところが、ブログ2で使用している BlogEngine.NET 2.0 の場合、レーティングや APML フィルターのラベルの国際化対応にバグがあるらしく、下の画像で赤枠で囲った部分のように英文になってしまいます。(ちなみに、ブログ1で使用している BlogEngine.NET 1.6.1 の場合はこの問題ありません)

国際化の不具合

ブログ2開設当時からこの問題には気づいていたのですが、原因を探すのが面倒だったし、致命的な問題ではないので放置してきました。(汗)

何年も放置しておいて今さらなんですが、やっぱり気になるので修正しました。ブラウザの言語設定が日本語になっていれば、レーティングのラベル部分も日本語で表示されているはずです。ブラウザの設定で英語とかフランス語を最上位に持ってくれば、その言語で表示されるはずです。

どこが問題だったか、どのように修正したかを以下に備忘録として書いておきます。

最初は App_GlobalResources フォルダにあるリソースファイルの問題かと思っていましたが、リソースファイルはこの問題のないバージョン 1.6.1 のものと同じでした。ということは、リソースを取得する方法に問題があるということになります。

レーティングの表示は、バージョン 1.6.1, 2.0 いずれも blog.js という名前の外部スクリプトファイルを読み込んで、その中の showRating, applyRatings というメソッドで html ソースを生成しています。

その際、ラベルに表示する文字列は、BlogEngine.i18n.beTheFirstToRate とか BlogEngine.i18n.currentlyRated という変数に定義されます。この定義の仕方がバージョン 1.6.1 と 2.0 とでは異なっています。

バージョン 1.6 では BlogBasePage クラスに AddLocalizationKeys というメソッドがあり、これにより BlogEngine.i18n.beTheFirstToRate 等の変数定義をインラインでページに書き込んでいます。書き込む際、GetGlobalResourceObject メソッドを利用して、ブラウザの言語設定に従って自動的に正しいリソースファイルを選択して文字列を取得しているので、正しい言語の文字列が変数に設定されます。

バージョン 2.0 ではこの部分が異なっていて、1.6.1 のようにページに変数定義をインラインで埋め込むのではなく、BlogBasePage クラスの Utils.AddJavaScriptResourcesToPage(this); によって、以下のような外部スクリプトファイルとして定義されます。(キャッシュを利用できるようにするため)

<script 
  type="text/javascript" 
  src="http://surferonwww.info/BlogEngine2/res.axd?lang=en-gb">
</script>

問題は、上記 src 属性に設定される url のクエリ文字列 lang=en-gb です。この en-gb は BlogSettings.Instance.Language から取得していますが、ブラウザの言語設定に関係なく常に "en-GB" になってしまいます。

HTTP ハンドラ res.axd(ResourceHandler.cs に定義されている)はクエリ文字列を見て、これに該当するリソースファイルから文字列を取得します。クエリ文字列は常に lang=en-gb なので、レーティング等に表示されるラベルは常に英語になってしまいます。

修正は AddJavaScriptResourcesToPage メソッドで BlogSettings.Instance.Language を使用せず、Thread.CurrentUICulture プロパティで現在のカルチャを取得して設定するようにしました。

具体的には以下の通りです。

Utils.cs の AddJavaScriptResourcesToPage メソッド

public static void AddJavaScriptResourcesToPage(Page page)
{
  // BlogSettings.Instance.Language は "en-GB" になってしまい、
  // ブラウザの言語設定が反映されない。結果レーティング等に表示
  // される文字列が英語で固定となってしまう。
  // var resourcePath = 
  //    Web.HttpHandlers.ResourceHandler.GetScriptPath(
  //        new CultureInfo(BlogSettings.Instance.Language));

  // それを以下のように修正:
  CultureInfo ci = 
      System.Threading.Thread.CurrentThread.CurrentUICulture;
  string resourcePath = 
      Web.HttpHandlers.ResourceHandler.GetScriptPath(ci);

  var script = string.Format(
      "<script type=\"text/javascript\" src=\"{0}\"></script>", 
      resourcePath);
  page.ClientScript.RegisterStartupScript(
      page.GetType(), 
      resourcePath.GetHashCode().ToString(), 
      script);
}

その他、この修正に伴って、日本語にすると AMPL の入力窓の幅が不足して表示が崩れる問題が出ましたので、blog.js の filterByAPML: function () の中の div.style.width = '400px'; を 450px に変更しました。(マイナーな問題ですが忘れないように書いておきます)

Tags:

BlogEngine.NET 2.0

About this blog

ここブログ2は日々の出来事、ブログ1はプログラミング関係のトピックスになっています。

Calendar

<<  March 2025  >>
MoTuWeThFrSaSu
242526272812
3456789
10111213141516
17181920212223
24252627282930
31123456

View posts in large calendar