4

これまでに次のことを試しました-1)タイムアウトを処理するためのカスタム属性を追加しました。

 public class TimeOutFilter : 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 に以下を追加

filters.Add(new TimeOutFilter());

[TimeOutFilter] 属性を使用してコントローラーを装飾しました

2) 次のようにコントローラー/アクションを装飾するために AsyncTimeout 属性を追加しました。

[AsyncTimeout(10)]

3) executionTimeout を web.config ファイルの値に設定します。

<httpRuntime targetFramework="4.5" maxRequestLength="10240" executionTimeout="10" />

4) コントローラーで HttpContext.Server.ScriptTimeout を何らかの値に設定します。

HttpContext.Server.ScriptTimeout = 10;

ポイント 1 の手順を使用して、リクエストのタイムアウト時にユーザーをログイン画面にリダイレクトすることができました。しかし、これは私が探しているものではありません。

リクエストのタイムアウトが発生したときに例外を取得またはトリガーする方法を探しています。

これを行う方法があれば誰か教えてください。

4

1 に答える 1

1

失礼なスレッド アボート動作(1) および (4) を使用しないでください。

AsyncTimeout 属性 (2) は適切ですが、(web.config の executionTimeout のように) タイムアウト期間を宣言するだけです (3)。

mvc5 の完全非同期パイプラインでは、操作をタイムアウトする効率的な方法の 1 つにすぎません。 CancellationTokensを使用してスローします。

これらのトークンは、パラメーターによって、またはRequest.TimedOutTokenおよびResponse.ClientDisconnectedTokenプロパティを使用して取得できます。

このブログ投稿は私を大いに助けてくれました。

于 2016-11-23T08:34:39.207 に答える