8

クラシック ASP と ASP.NET の両方の開発者としての経験から、Server.ScriptTimeout値を設定するための呼び出しはスコープ内で現在の要求に対してローカルであることを常に理解していました。つまり、呼び出しServer.ScriptTimeout = 600により、現在の要求の処理時間が 10 分に設定されます。他のリソースへの後続の、または同時のリクエストでも、 のデフォルト設定が使用されますServer.ScriptTimeout

最近のコード レビューで、値を設定すると、アプリケーション プールがリサイクルされるまで、サイト内のすべてServer.ScriptTimeoutのページの処理時間が設定されることが通知されました。提案された「修正」は、次のようなものでした。

public class MyPage : Page {
  private const int desiredTimeout = 600;
  private int cachedTimeout;

  private void Page_Load(object sender, EventArgs e) {
    // cache the current timeout in a private store.
    cachedTimeout = Server.ScriptTimeout;
    Server.ScriptTimeout = desiredTimeout;
  }

  private void Page_Unload(object sender, EventArgs e) {
    // restore the previous setting for the timeout
    Server.ScriptTimeout = cachedTimeout;
  }
}

Server.ScriptTimeout = 1他のすべてのページは 1 秒間しか処理できないため、ページを呼び出している開発者がサイトをダウンさせる可能性があるため、これは私には奇妙に思えます。さらに、この動作は、現在の Page_Load イベントと Page_Unload イベントの間に発生する可能性のある現在のリクエストに影響を与えます。これは同時実行の悪夢のようです。

ただし、徹底するために、2 つのページで構成されるテスト ハーネスを作成しました。ページ 1Server.ScriptTimeoutは非常に大きな数値に設定し、ページ 2は の現在の値を表示するだけですServer.ScriptTimeoutPage Oneに設定した値に関係なく、Page Twoには常にデフォルト値が表示されます。Server.ScriptTimeoutしたがって、私のテストでは、それがスコープ内でローカルであることを確認しているようです。

私のweb.configにdebug = "true"が含まれServer.ScriptTimeoutていても効果がないことに注意しました-MSDNはこれをページに明示的に記載しています。このモードでは、値を読み取るためのすべての呼び出しは、Server.ScriptTimeout設定に関係なく、途方もなく大きな数を返します。

だから私の質問は、何かが欠けていないことを確実にするために、値を設定するとサイト全体Server.ScriptTimeout(スコープ内でグローバル)の処理時間に影響を与えるインスタンスがあるか、またはその効果がローカルであるという私の信念は有効かということです現在のコンテキストのみに? 私はこの質問を無駄にグーグルで検索しましたが、MSDN はこの問題について沈黙しているようです。

リンクや経験 - 何らかの形で - は大歓迎です! これをカバーするドキュメントは不足しているようです。信頼できる情報をいただければ幸いです。

4

1 に答える 1

10

それは確かにリクエスト固有です:

public int ScriptTimeout
{
    get
    {
        if (this._context != null)
        {
            return Convert.ToInt32(this._context.Timeout.TotalSeconds, CultureInfo.InvariantCulture);
        }
        return 110;
    }
    [AspNetHostingPermission(SecurityAction.Demand, Level=AspNetHostingPermissionLevel.Medium)]
    set
    {
        if (this._context == null)
        {
            throw new HttpException(SR.GetString("Server_not_available"));
        }
        if (value <= 0)
        {
            throw new ArgumentOutOfRangeException("value");
        }
        this._context.Timeout = new TimeSpan(0, 0, value);
    }
}

HttpContextはどこ_contextですか

于 2012-08-11T21:15:46.120 に答える