web-dev-qa-db-ja.com

IIS長いASP.NET操作でのリクエストタイムアウト

長時間の操作を実行すると、IISからのリクエストタイムアウトが発生します。舞台裏では、ASP.NETアプリケーションがデータを処理していますが、処理されるレコードの数が多いため、操作に時間がかかります。

ただし、IISはセッションをタイムアウトすると思います。これはIISまたはASP.NETセッションの問題ですか?

前もって感謝します

80
Tachi

ASP.NETスクリプトの実行に許可される時間を延長する場合は、 Server.ScriptTimeout 値を増やします。デフォルトは、.NET 1.xでは90秒、.NET 2.0以降では110秒です。

例えば:

// Increase script timeout for current page to five minutes
Server.ScriptTimeout = 300;

この値は、 httpRuntime 構成要素のweb.configファイルでも構成できます。

<!-- Increase script timeout to five minutes -->
<httpRuntime executionTimeout="300" 
  ... other configuration attributes ...
/>

enter image description here

MSDNドキュメント に従って注意してください:

「このタイムアウトは、コンパイル要素のデバッグ属性がFalseの場合にのみ適用されます。したがって、デバッグ属性がTrueの場合、デバッグ中にアプリケーションのシャットダウンを回避するために、この属性を大きな値に設定する必要はありません。 」

既にこれを実行しているが、セッションの有効期限が切れていることがわかっている場合は、ASP.NET HttpSessionState.Timeout 値を増やします。

例えば:

// Increase session timeout to thirty minutes
Session.Timeout = 30;

この値は、sessionState構成要素のweb.configファイルでも構成できます。

<configuration>
  <system.web>
    <sessionState 
      mode="InProc"
      cookieless="true"
      timeout="30" />
  </system.web>
</configuration>

スクリプトの実行に数分かかり、同時に多くのユーザーがいる場合は、ページを Asynchronous Page に変更することを検討してください。これにより、アプリケーションのスケーラビリティが向上します。

サーバーへの管理者アクセス権がある場合、もう1つの選択肢は、この長時間実行される操作を、スケジュールされたタスクまたはWindowsサービスとして実装する候補と見なすことです。

140
Kev

@Kevによるすばらしい網羅的な回答!

WebFormsアプリケーションの1つの管理ページでのみ長い処理を行ったため、コードオプションを使用しました。しかし、実稼働環境での一時的な迅速な修正を可能にするために、web.configの<location>タグで構成バージョンを使用しました。このようにして、管理者/処理ページに十分な時間がかかりましたが、エンドユーザーなどのページは古いタイムアウト動作を維持しました。

以下に、同じクイックフィックスが必要なGoogle社員向けの設定を示しました。もちろん、「4時間」の例以外の値を使用する必要がありますが、DOセッションtimeOutは分単位であることに注意してください。リクエストexecutionTimeoutは数秒です!

そして-それはすでに2015年なので-クイックフィックスでは、可能な場合は.Net 4.5の async/await を使用する必要があります。 2010年にKEVが回答したときのアート:)。

<configuration>
    ... 
    <compilation debug="false" ...>
    ... other stuff ..

    <location path="~/Admin/SomePage.aspx">
        <system.web>
            <sessionState timeout="240" />
            <httpRuntime executionTimeout="14400" />
        </system.web>
    </location>
    ...
</configuration>
20
Bart

ここに投稿しているのは、3時間と4時間かかったからです。上記のような答えが見つかりました。つまり、executionTimeを追加しますが、それは解決しません。 ASP .NET Coreを使用している場合の問題。それのために、これはうまくいくでしょう:

Web.configファイルで、requestTimeoutノードにaspNetCore属性を追加します。

<system.webServer>
  <aspNetCore requestTimeout="00:10:00" ... (other configs goes here) />
</system.webServer>

この例では、値を10分間設定しています。

参考: https://docs.Microsoft.com/en-us/aspnet/core/hosting/aspnet-core-module#configuring-the-asp-net-core-module

8