Загрузка файлов возобновляется через 30 минут в IIS 7
Эта проблема
Проблема в том, что загрузка файла, который занимает более 30 минут, не удастся необычным образом. Я использовал Google Chrome для моего тестирования и почти точно на 30-минутной отметке (загруженное количество не имеет значения, это всегда происходит в ~1800 секунд), процесс загрузки сбрасывается до "0%" и начинается снова.
Там нет сообщений от браузера, что что-то пошло не так, он просто возобновляет загрузку. (Даже просмотр "Сеть" в инструментах разработчика показывает только один пост-запрос). Просмотр в окне "Просмотр событий" на сервере также не вызывает ничего необычного. Что-то, что я заметил, было то, что обычно временные файлы загрузки для ColdFusion помещаются в "ColdFusion9\runtime\servers\coldfusion\SERVER-INF\temp\wwwroot-tmp" и удаляются, когда загрузка завершается или прерывается. Когда эта проблема возникает, эти временные файлы не удаляются.
Тот факт, что это происходит на двух системах в совершенно разных местах и всегда в 1800 секунд, заставляет меня думать, что где-то должен быть установлен тайм-аут по умолчанию, но я просто не могу найти ошибку.
Может кто-нибудь предложить предложения о том, где искать или (я знаю, это безумие), что на самом деле причина?
Некоторая информация
Конфигурация (и) тестовой системы:
Windows Server 2008 Standard & Windows Web Server 2008 R2
IIS 7 & 7.5
ColdFusion 9 Standard
Моя форма выглядит так:
<form name="frmUpload" method="post" enctype="multipart/form-data" action="upload.cfm?Action=Upload">
<input type="hidden" name="Submit" value="1" />
<input type="file" name="File" />
<input type="submit" name="SubmitButton" value="Submit" />
</form>
Мой web.config выглядит так:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<httpErrors existingResponse="PassThrough" />
<urlCompression doDynamicCompression="true" />
<defaultDocument>
<files>
<clear />
<add value="login.cfm" />
<add value="index.cfm" />
<add value="index.htm" />
<add value="index.html" />
</files>
</defaultDocument>
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="2147482624" />
</requestFiltering>
</security>
</system.webServer>
<system.web>
<httpRuntime executionTimeout="21600" maxRequestLength="2097151"/>
</system.web>
</configuration>
Когда загрузка возобновляется, в журналах IIS отображаются (обратите внимание на два последних значения "получено байт" и "занято время"):
2012-06-07 17:35:02 192.168.200.184 POST upload.cfm Action=Upload 443 - 192.168.1.230 Mozilla/5.0+(Windows+NT+6.1;+WOW64)+AppleWebKit/536.5+(KHTML,+like+Gecko)+Chrome/19.0.1084.52+Safari/536.5 500 0 0 1473 214483824 1800801
Есть также записи в файле "coldfusion-out.log", которые происходят примерно в одно и то же время:
06/07 14:35:21 error unexpected end of part
java.io.IOException: unexpected end of part
at com.oreilly.servlet.multipart.PartInputStream.fill(PartInputStream.java:96)
at com.oreilly.servlet.multipart.PartInputStream.read(PartInputStream.java:191)
at com.oreilly.servlet.multipart.PartInputStream.read(PartInputStream.java:152)
at com.oreilly.servlet.multipart.FilePart.write(FilePart.java:257)
at com.oreilly.servlet.multipart.FilePart.writeTo(FilePart.java:215)
at coldfusion.filter.FormScope.fillForm(FormScope.java:253)
at coldfusion.filter.FusionContext.SymTab_initForRequest(FusionContext.java:377)
at coldfusion.filter.GlobalsFilter.invoke(GlobalsFilter.java:33)
at coldfusion.filter.DatasourceFilter.invoke(DatasourceFilter.java:22)
at coldfusion.filter.CachingFilter.invoke(CachingFilter.java:62)
at coldfusion.filter.RequestThrottleFilter.invoke(RequestThrottleFilter.java:126)
at coldfusion.CfmServlet.service(CfmServlet.java:200)
at coldfusion.bootstrap.BootstrapServlet.service(BootstrapServlet.java:89)
at jrun.servlet.FilterChain.doFilter(FilterChain.java:86)
at coldfusion.monitor.event.MonitoringServletFilter.doFilter(MonitoringServletFilter.java:42)
at coldfusion.bootstrap.BootstrapFilter.doFilter(BootstrapFilter.java:46)
at jrun.servlet.FilterChain.doFilter(FilterChain.java:94)
at jrun.servlet.FilterChain.service(FilterChain.java:101)
at jrun.servlet.ServletInvoker.invoke(ServletInvoker.java:106)
at jrun.servlet.JRunInvokerChain.invokeNext(JRunInvokerChain.java:42)
at jrun.servlet.JRunRequestDispatcher.invoke(JRunRequestDispatcher.java:286)
at jrun.servlet.ServletEngineService.dispatch(ServletEngineService.java:543)
at jrun.servlet.jrpp.JRunProxyService.invokeRunnable(JRunProxyService.java:203)
at jrunx.scheduler.ThreadPool$DownstreamMetrics.invokeRunnable(ThreadPool.java:320)
at jrunx.scheduler.ThreadPool$ThreadThrottle.invokeRunnable(ThreadPool.java:428)
at jrunx.scheduler.ThreadPool$UpstreamMetrics.invokeRunnable(ThreadPool.java:266)
at jrunx.scheduler.WorkerThread.run(WorkerThread.java:66)
06/07 14:35:21 error (JRun Service: ProxyService [jrun.servlet.jrpp.JRunProxyService@2cf889c8]) JRunPRoxyServer.invokeRunnable:
java.lang.IllegalStateException
at jrun.servlet.JRunResponse.getWriter(JRunResponse.java:205)
at jrun.servlet.JRunResponse.sendError(JRunResponse.java:597)
at jrun.servlet.JRunRequestDispatcher.invoke(JRunRequestDispatcher.java:328)
at jrun.servlet.ServletEngineService.dispatch(ServletEngineService.java:543)
at jrun.servlet.jrpp.JRunProxyService.invokeRunnable(JRunProxyService.java:203)
at jrunx.scheduler.ThreadPool$DownstreamMetrics.invokeRunnable(ThreadPool.java:320)
at jrunx.scheduler.ThreadPool$ThreadThrottle.invokeRunnable(ThreadPool.java:428)
at jrunx.scheduler.ThreadPool$UpstreamMetrics.invokeRunnable(ThreadPool.java:266)
at jrunx.scheduler.WorkerThread.run(WorkerThread.java:66)
java.lang.IllegalStateException
at jrun.servlet.JRunResponse.getWriter(JRunResponse.java:205)
at jrun.servlet.JRunResponse.sendError(JRunResponse.java:597)
at jrun.servlet.JRunRequestDispatcher.invoke(JRunRequestDispatcher.java:328)
at jrun.servlet.ServletEngineService.dispatch(ServletEngineService.java:543)
at jrun.servlet.jrpp.JRunProxyService.invokeRunnable(JRunProxyService.java:203)
at jrunx.scheduler.ThreadPool$DownstreamMetrics.invokeRunnable(ThreadPool.java:320)
at jrunx.scheduler.ThreadPool$ThreadThrottle.invokeRunnable(ThreadPool.java:428)
at jrunx.scheduler.ThreadPool$UpstreamMetrics.invokeRunnable(ThreadPool.java:266)
at jrunx.scheduler.WorkerThread.run(WorkerThread.java:66)