3

私は大学で働いており、学生や出席統計に関する非常に多くのレポートを含む ASP.NET サイトを開発しています...データの基礎は、学生管理システムのバックエンドである MSSQL サーバー DB です。これには、木曜日の朝に、時間の長さが不明な定期的なメンテナンス期間があります (何を行う必要があるかによって異なります)。

ほとんどのスタッフはこのことを認識していますが、頻繁に使用しないユーザーからは永遠に電話がかかってくるようです。メンテナンス中にサイトを無効にする最も簡単な方法は何ですか?明らかに、DBクエリを試してサイトが稼働しているかどうかをテストできますが、たとえば、すべてのユーザーを「メンテナンスのためにダウンしています」メッセージにリダイレクトする最善の方法がわからない.ウェブサイトがダウンする前にセッションを開始できた可能性があることを念頭に置いてください。

ページごとではなく、グローバルに何かを実装できることを願っています。

4

8 に答える 8

12

「app_offline.htm」という html ファイルを仮想ディレクトリのルートにドロップします。そのような単純な。

件名と友好的なエラーについてのスコット・ガスリー。

于 2008-09-17T23:53:48.817 に答える
1

エラーが発生した後ではなく、Application_PreRequestHandlerExecuteで実行することをお勧めします。一般に、データベースが利用できないことがわかっている場合は、通常の処理を開始しないことをお勧めします。私は通常、以下のようなものを使用します

void Application_PreRequestHandlerExecute(Object sender, EventArgs e)
{
 string sPage = Request.ServerVariables["SCRIPT_NAME"];
 if (!sPage.EndsWith("Maintenance.aspx", StringComparison.OrdinalIgnoreCase))
 {
  //test the database connection
  //if it fails then redirect the user to Maintenance.aspx
  string connStr = ConfigurationManager.ConnectionString["ConnectionString"].ConnectionString;
  SqlConnection conn = new SqlConnection(connStr);
  try
  {
   conn.Open();
  }
  catch(Exception ex)
  {
   Session["DBException"] = ex;
   Response.Redirect("Maintenance.aspx");
  }
  finally
  {
   conn.Close();
  }
 }
}
于 2008-09-18T00:39:18.880 に答える
1

サイトがダウンしていて、誰かがアクセスしようとするとどうなりますか? ADO.NET は、特定の例外をスローしてキャッチし、「Web サイト ダウン」ページにリダイレクトできますか?

プロジェクトに "Global.asax" ファイルを追加し、そのコード ビハインドに "Application_Error" イベント ハンドラーを追加することができます。Web アプリのどこからでも、例外がスローされてキャッチされない場合はいつでも起動します。たとえば、C# では次のようになります。

protected void Application_Error(object sender, EventArgs e)
{
    Exception e = Server.GetLastError().GetBaseException();
    if(e is SqlException)
    {    
        Server.ClearError();
        Server.Transfer("~/offline.aspx");
    }
} 

例外の Number プロパティを確認することもできますが、どの番号がデータベース サーバーに接続できなかったことを示しているかはわかりません。ダウンしている間にこれをテストし、SQL エラー番号を見つけて、オンラインで調べて、本当にチェックしたいものかどうかを確認できます。

編集:あなたの言っていることがわかります、ピートボブ。

于 2008-09-18T00:14:07.287 に答える
1

ログインした人に「サイトはメンテナンスのため xxx 分後にダウンします」というメッセージを表示し、xxx 分後に全員をログアウトするサービスを実行できます。次に、すべてのページがアクセスできる場所にフラグを設定し、すべてのページ (またはテンプレート ページのみ) の上部で、そのフラグが設定されているかどうかをテストします。設定されている場合は、メンテナンス ページのためにダウンしているサイトにリダイレクト ヘッダーを送信します。

于 2008-09-17T23:57:49.417 に答える
1

ユーザーが既にサイト内を移動している場合、またはブックマーク/外部リンクから特定のページへのサイトにアクセスしている場合、「offline.html」ページは機能しません。

私が使用する解決策は、同じアドレス (IP またはホスト ヘッダー) を持つ 2 つ目の Web サイトを作成することですが、デフォルトでは無効にしています。Web サイトがダウンすると、スクリプトが「実際の」Web サイトを無効にし、代わりに「メンテナンス」Web サイトを有効にします。オンラインに戻ると、別のスクリプトが「実際の」Web サイトに戻ります。

「メンテナンス」Web サイトは別のルート ディレクトリにあり、メッセージ (および必要な画像/css ファイル) を含む 1 つのページがあります。

どのページにも同じメッセージを表示するには、「メンテナンス」Web サイトに 404 エラー ハンドラを設定し、すべての要求を同じ「Web サイトはメンテナンスのため停止しています」ページにリダイレクトします。

于 2008-09-18T00:01:05.977 に答える
0

すべてのページでのDBチェックのもう少し洗練されたバージョンは、Global.asaxファイルでチェックを実行するか、他のすべてのページが継承するマスターページを作成することです。

オンラインサイトとオフラインサイトを用意するという提案は非常に優れていますが、サーバー上で管理するサイトの数が限られている場合にのみ適用できます。

編集:くそー、私がページをロードした後、これらの提案に関する他の答えが出てきました。返信する前に更新することを忘れないでください:)

于 2008-09-18T00:41:05.413 に答える
0

Jamesコードは、接続を閉じるのを忘れています。おそらく次のようになります。

try
{
   conn.Open();
}
catch(Exception ex)
{
   Session["DBException"] = ex;
   Response.Redirect("Maintenance.aspx");
}
finally
{
   conn.Close();
}
于 2008-09-18T00:44:45.390 に答える
0

私はメンテナンスを行っているわけではなく、常に IIS にアクセスしているわけでもありません。また、すべてのプログラマーと同じように、私は少し怠け者なので、何もしないオプションを好みます。

すべてのページでフラグをチェックする方法があることは知っていますが、それを避けたいと思っています。global.asax ページで何かできないだろうか?

Application_BeginRequest に少しのコードを入れて、SQL の状態を確認してからリダイレクトできると思います。

HttpContext context = HttpContext.Current;
     if (!isOnline())
     {
        context.Response.ClearContent();
        context.Response.Write("<script language='javascript'>" + 
"top.location='" + Request.ApplicationPath + "/public/Offline.aspx';</scr" + "ipt>");
     } 

または、私は仕事をしていないので、まだテストされていないので、そのようなものは完璧ではないかもしれません. コメントをお待ちしております。

于 2008-09-18T00:24:16.123 に答える