1

2 つの質問があります。

1) global.asaxファイルで宣言された Web サイト用のグローバル変数がいくつかあります。それらは単純で小さなキーと値のペアであり、その数はわずかです。これは、値が小さく、Web サイトのほぼすべてのページからアクセスする必要がある場合に適していますか? それらをデータベースに格納し、db ルックアップを要求することは、急速に変化しない値のためにリソースを浪費すると考えられているようです。

2) 値の 1 つが 1 週間に 1 回変更される場合、ユーザーがフォームまたはその他の手段でグローバル変数を編集できるようにすることは可能ですか?

例:

<script runat="server">

  Overloads Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)

      Application("default_scoring_id") = 3
      Application("week_current") = 3

  End Sub

</script>

上記の例では、システムは現在の日付がどの週 (15 週のうち) にあるかを知る必要があります。したがって、毎週月曜日の朝に一度、「week_current」の値を変更する必要があります。

これは簡単に行うことができますが、コードに触れずにこの値を変更するアクセス権をユーザーに付与する方法はありますか?

4

6 に答える 6

2

典型的な方法は、これらを編集可能な web.config に入れることです。これらの<appSettings>値はすべてのページで使用できますが、ファイルは編集できます。

于 2009-05-26T03:29:33.673 に答える
1

1) 通常、これらの種類の値を web.config に保存することをお勧めします。いくつかのガイドについては、こちらこちらを参照してください。

2) a) これを web.config に保存すると、再コンパイルせずに簡単に更新でき、Web アプリケーションは変更をすぐに取得する必要があります。

b) 「週番号」などの更新は、本当に手作業で行う必要がありますか? 少しエラーが発生しやすいように聞こえますが、現在の日付に基づいて計算することで、可能であればこれを自動化することをお勧めします。

于 2009-05-26T03:37:00.917 に答える
1

組み込みのキャッシュ (System.Web.Caching.Cache) の使用を検討します。

そうすれば、必要な場所 (データベースなど) に保存したり、アプリ内から簡単に変更したり、すばやく安価に取得したりできます。

BasePage から継承するクラス内からは、指定された Cache オブジェクト (例: Cache.Add(..)) を使用し、他の場所からは HttpContext.Current.Cache (例: HttpContext.Current.Cache.Remove(Key)) を使用します。

于 2009-05-26T03:35:53.477 に答える
0
<%@ Application Language="C#" %>

<script runat="server">

    void Application_Start(object sender, EventArgs e) 
    {
    // Code that runs on application startup

    }

    void Application_End(object sender, EventArgs e) 
    {
    //  Code that runs on application shutdown

    }

    void Application_Error(object sender, EventArgs e) 
    { 
    // Code that runs when an unhandled error occurs

    }

    void Session_Start(object sender, EventArgs e) 
    {

    // Code that runs when a new session is started

    }

    void Session_End(object sender, EventArgs e) 
    {
    // Code that runs when a session ends. 
    // Note: The Session_End event is raised only when the sessionstate mode
    // is set to InProc in the Web.config file. If session mode is set to StateServer 
    // or SQLServer, the event is not raised.

    }
    protected void Application_BeginRequest(Object sender, EventArgs e)
    {
    Context.Items.Add("Request_Start_Time", DateTime.Now);
    }
    protected void Application_EndRequest(Object sender, EventArgs e)
    {
    TimeSpan tsDuration = DateTime.Now.Subtract((DateTime)Context.Items["Request_Start_Time"]);
    Context.Response.Write("<b>Request Processing Time: From Global.asax file " + tsDuration.ToString());
    Application["time"] = tsDuration.ToString();
    }

</script>
于 2013-03-11T09:36:04.353 に答える
0

Web.config は .NET 方式または ASP.NET 方式であり、常に最も効率的または最適であるとは限りません。

Global.asax ファイルはいくつかのイベントよりもはるかに多く、System.Web.HttpApplication をサブクラス化する任意のクラスに静的データを配置し、それを Global.asax ファイルに継承できます。

HttpSessionState と HttpApplicationState は、従来の ASP 時代の遺物であり、本当の目的を果たさないため、これらを避けることをお勧めします。

オブジェクトのタイプ (System.Type) に応じて、アプリケーションとセッションに関する情報を格納する独自の厳密に型指定されたオブジェクトを設計できます。アプリケーション レベルのデータについては、一連の静的フィールドで十分です。

各 HttpModule と HttpApplication インスタンスはプールされたオブジェクトであるため、それらは静的である必要があります。そのため、その混乱を避けるために、永続データが静的または複数の静的辞書に格納されていることを確認してください。ただし、これらのコレクションを変更するときは、同時実行の問題に注意してください。良い戦略は、オブジェクトを変更している間だけオブジェクトをロックし、コレクションを変更している間は他のコードを呼び出さないようにすることです。これは単純なスワップ イディオムです。 -デッドロック保証。

于 2009-05-26T05:16:02.833 に答える
0

他の回答は、これを実行できるさまざまな方法を示唆しており、実行する必要があります。ただし、それでもユーザーがグローバル変数を編集できるようにしたい場合は、共有オブジェクトでロックまたは Mutex を取得し、グローバル変数の値を変更して、ロックまたは Mutex を解放する必要があります。

lock(globalsharedobject) //This is C# code.
{
    Application("default_scoring_id") = 3;
}
于 2009-05-26T04:09:47.870 に答える