8

タイムアウトを設定しようとしていますが、リクエストがタイムアウトしません。これをいくつかの方法で設定しようとしました:

これを web.config に入れることによって (アプリケーションの web.config とビュー フォルダー内の両方で)

<httpRuntime executionTimeout="5" />

デバッグモードではないことを確認しました

<compilation debug="false" targetFramework="4.0">

コードでスクリプトのタイムアウトを設定しようとしましたが (同じであるはずですが)、Thread.Sleep を 3 分間追加しました (デフォルトのタイムアウトを十分に上回っていることを確認するため)。このアクションはまだタイムアウトしません。 :

public ActionResult Index()
{
    Server.ScriptTimeout = 5;
    Thread.Sleep(60 * 1000 * 3);
    return View();
}

複数のマシンで発生しており、テンプレートから上記の変更のみを加えた新しいソリューションと、新しい IIS Web サイト アプリケーション プールを作成することさえしましたが、タイムアウトを取得できません。

不足している簡単な構成設定はありますか? これは簡単にできるはずです...

4

1 に答える 1

8

最終的な解決策に追加するには: 上記のリンクには、MVC に現在の HttpContext のタイムアウトを強制する方法があります。

System.Web.HttpContext.Current.GetType().GetField("_timeoutState", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).SetValue(System.Web.HttpContext.Current, 1);

すべてのリクエストで実行する必要があるため、グローバル アクション フィルターを作成しました。

public class Timeoutter : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        System.Web.HttpContext.Current.GetType().GetField("_timeoutState", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).SetValue(System.Web.HttpContext.Current, 1);
        base.OnActionExecuting(filterContext);
    }
}

それを登録するには、アプリの global.asax で次のようにします。

    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new Timeoutter());
    }

このソリューションでは、web.config に上記の同じ 2 行が必要であることに注意してください。

<httpRuntime executionTimeout="5" />
<compilation debug="false" targetFramework="4.0">
于 2012-07-25T20:41:11.050 に答える