หมดเวลาการร้องขอ IIS ในการดำเนินการ ASP.NET ที่ยาวนาน


90

ฉันกำลังประสบปัญหาการหมดเวลาของคำขอจาก IIS เมื่อฉันเรียกใช้การดำเนินการที่ยาวนาน เบื้องหลังแอปพลิเคชัน ASP.NET ของฉันกำลังประมวลผลข้อมูล แต่จำนวนบันทึกที่ประมวลผลมีมากจึงทำให้การดำเนินการใช้เวลานาน

อย่างไรก็ตามฉันคิดว่า IIS หมดเวลาเซสชัน นี่เป็นปัญหากับเซสชัน IIS หรือ ASP.NET หรือไม่

ขอบคุณล่วงหน้า

คำตอบ:


148

หากคุณต้องการขยายระยะเวลาที่อนุญาตให้สคริปต์ ASP.NET ดำเนินการให้เพิ่มServer.ScriptTimeoutค่า ค่าเริ่มต้นคือ 90 วินาทีสำหรับ. NET 1.x และ 110 วินาทีสำหรับ. NET 2.0 และใหม่กว่า

ตัวอย่างเช่น:

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

ค่านี้ยังสามารถกำหนดค่าในweb.configไฟล์ของคุณในhttpRuntimeองค์ประกอบการกำหนดค่า:

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

ใส่คำอธิบายภาพที่นี่

โปรดทราบตามเอกสาร MSDN :

"การหมดเวลานี้จะมีผลต่อเมื่อแอตทริบิวต์การดีบักในองค์ประกอบการคอมไพล์เป็น False ดังนั้นหากแอตทริบิวต์การดีบักเป็น True คุณไม่จำเป็นต้องตั้งค่าแอตทริบิวต์นี้เป็นค่าขนาดใหญ่เพื่อหลีกเลี่ยงการปิดแอปพลิเคชันในขณะที่คุณกำลังดีบัก "

หากคุณได้ดำเนินการแล้ว แต่พบว่าเซสชันของคุณกำลังจะหมดอายุให้เพิ่มHttpSessionState.Timeoutค่าASP.NET :

ตัวอย่างเช่น:

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

ค่านี้ยังสามารถกำหนดค่าในweb.configไฟล์ของคุณในsessionStateองค์ประกอบการกำหนดค่า:

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

ถ้าสคริปต์ของคุณใช้เวลาหลายนาทีในการดำเนินการและมีผู้ใช้งานพร้อมกันหลายคนแล้วพิจารณาเปลี่ยนหน้าไปยังAsynchronous หน้า สิ่งนี้จะเพิ่มความสามารถในการปรับขนาดของแอปพลิเคชันของคุณ

อีกทางเลือกหนึ่งหากคุณมีสิทธิ์การเข้าถึงเซิร์ฟเวอร์ของผู้ดูแลระบบคือการพิจารณาการดำเนินการที่ยาวนานนี้เป็นตัวเลือกสำหรับการนำไปใช้งานตามกำหนดการหรือบริการ windows


FYI httpRuntimeuntimeTimeout เป็นวินาทีและไม่มีตัวพิมพ์ใหญ่ T
Andrew Rimmer

7
สิ่งสำคัญคือต้องทราบว่าโหมดดีบักถูกตั้งค่าเป็นเท็จเพื่อให้ใช้ค่าการหมดเวลานี้: <system.web> <compilation debug = "false" targetFramework = "4.0" /> </ system.web>
Jesse Roper

@JesseRoper หากคุณสามารถชี้ให้ฉันดูเอกสารได้ฉันยินดีที่จะรวมไว้ในคำตอบหรือคุณสามารถแก้ไขคำตอบของฉันได้โดยตรง ตะ.
Kev

ค่า Default ExecutionTimeout คือ 110 วินาที
frattaro

21

คำตอบที่ยอดเยี่ยมและละเอียดถี่ถ้วนโดย @Kev!

เนื่องจากฉันทำการประมวลผลเป็นเวลานานในหน้าผู้ดูแลระบบเดียวในแอปพลิเคชัน WebForms ฉันจึงใช้ตัวเลือกรหัส แต่เพื่อให้การแก้ไขด่วนชั่วคราวในการใช้งานจริงฉันใช้เวอร์ชัน config ใน<location>แท็กใน web.config ด้วยวิธีนี้ผู้ดูแลระบบ / หน้าการประมวลผลของฉันมีเวลาเพียงพอในขณะที่หน้าสำหรับผู้ใช้ปลายทางและหน้าเหล่านี้ยังคงพฤติกรรมการหมดเวลาเก่า ๆ

ด้านล่างนี้ฉันให้การกำหนดค่าสำหรับคุณ Googler ที่ต้องการการแก้ไขด่วนแบบเดียวกัน คุณ ofcourse ควรใช้ค่าอื่น ๆ กว่าตัวอย่างของฉัน '4 ชั่วโมง แต่DOทราบว่าช่วงที่timeOutอยู่ในนาทีในขณะที่การร้องขอexecutionTimeoutอยู่ในไม่กี่วินาที!

และเนื่องจากเป็นปี 2015 แล้วสำหรับ NON- Quickfix คุณควรใช้async / รอของ. Net 4.5 ตอนนี้ถ้าเป็นไปได้แทนที่จะเป็นหน้า ASYNC ของ. NET 2.0 ที่ทันสมัยเมื่อ KEV ตอบในปี 2010 :).

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

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

ฉันได้รวมข้อมูลโค้ด "สถานที่" ไว้ใน web.config แล้ว แต่ใช้งานไม่ได้ ฉันใช้ "ecutionTimeout "เท่านั้นฉันไม่ต้องการ" sessionState " ฉันต้องกำหนดค่าอย่างอื่นไหม ฉันใช้ NET 4.0 ถ้าฉันใช้ "httpRuntime" โดยตรงใน "system.web" การหมดเวลาจะใช้อย่างถูกต้องในทุกหน้า
Oliver

12

ฉันโพสต์สิ่งนี้ที่นี่เพราะฉันใช้เวลาไป 3 และ 4 ชั่วโมงและฉันพบเพียงคำตอบเช่นเดียวกับคำตอบข้างต้นที่บอกว่าเพิ่มexecutionTimeแต่มันไม่สามารถแก้ปัญหาได้ในกรณีที่ คุณกำลังใช้ASP .NET หลัก สำหรับมันสิ่งนี้จะใช้ได้:

ที่ไฟล์ web.config ให้เพิ่มrequestTimeoutแอตทริบิวต์ที่aspNetCorenode

<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


ใช้กับOutOfProcessโมเดลโฮสติ้งเท่านั้น สำหรับInProcessที่มีอยู่ไม่ตั้งค่าหมดเวลา IIS จะรอให้กระบวนการเสร็จสมบูรณ์อ้างอิงที่นี่: github.com/dotnet/AspNetCore.Docs/issues/16870
Rosdi Kasim

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.