cflocation больше не работает в CF10

Я боролся с ошибкой cflocation с тех пор, как перешел с CF9 на CF10. Я работал над этим несколько раз, но всегда сдавался, но сегодня меня, наконец, достаточно раздражает, что пришло время решить проблему (надеюсь).

Во-первых, я прошу прощения за то, что я пытался написать простой контрольный пример для воспроизведения этой проблемы, но до сих пор я не смог воспроизвести его за пределами исходного кода.

У меня есть многоэтапный процесс импорта, который должен выполняться в одночасье. Процесс состоит из примерно 10 файлов, которые соединяются вместе. При вызове процесса через запланированное задание также передается параметр URL (запланированная задача). Если параметр не существует, в конце каждого шага он останавливается и ждет, пока пользователь щелкнет ссылку на следующий шаг. Если параметр существует, он использует cflocation для перехода к следующему шагу.

Из всех этапов 2-й является наиболее сложным и трудоемким (данные из нескольких запросов веб-службы, которые затем необходимо объединить, очистить и вставить в базу данных). Это второй шаг, который имеет проблемы после перехода на CF10. Страница, кажется, работает нормально, так как она достигает самой нижней части страницы, где находится тег cflocation, но она никогда не запускает cflocation. Я добавил тег cfmail, чтобы отправить мне электронное письмо, так как вызывается cflocation, которая всегда отправляется, но опять же cflocation не срабатывает.

Это не может быть намного более простым, чем:

<cfif scheduledtask EQ "true">
   <cfmail from="xxxxx” to="xxxx” subject="About to call duplicate" type="text/html"> 
      <p>calling duplicate check - scheduledtask</p>
   </cfmail>

   <cflocation url="importDupCheck.cfm?scheduledtask=true" addtoken="false">
</cfif>

Я знаю, что есть проблемы с cfflush и cflocation, и я уже проверил это.

В качестве теста я попытался переместить вышеупомянутую логику вверх по странице, чтобы сразу после того, как все данные были получены веб-сервисом, но до того, как они были обработаны, и на этот раз cflocation сработал. Я подумал, может быть, это проблема тайм-аута, когда механизм запланированных задач перестал ждать, хотя страница полностью загружена. Я попытался проверить это, имея основной файл, который имел:

<cfset sleep(240000)>
 * 4 minutes

прежде чем он вызвал cflocation, но он работал нормально.

Другие шаги в этом процессе работают как и ожидалось с cflocation, но только не с этим. Весь этот код прекрасно работает под CF9, просто не работает с CF10.

У кого-нибудь есть какие-то указатели на то, где я должен искать?

С уважением Марк


* Обновление * Итак, я теперь разработал, как легко воспроизвести это в несколько строк кода. Оказывается, это не имеет ничего общего с запланированными задачами.

index.cfm

<h1>Testing cflocation</h1>

<cfloop index="i" from="1" to="7000" ><!--- For me it stops working once the loop goes beyond 6808 rows --->
    row <cfoutput>#i#</cfoutput>: abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789<br/>
</cfloop>

<p>Now loading resultpage via cflocation</p>
<cflocation url="resultpage.cfm" addtoken="false">

resultpage.cfm

<h1>Made it!</h1>
<p>Reload the <a href="index.cfm">first page</a></p>

В моем тестировании я обнаружил, что если я зациклился 6808 раз, он работает, но 6809 раз потерпел неудачу. С 7000 записями мы говорим только о файле 36 КБ... почему это происходит только в CF10?

И последнее, на что следует обратить внимание, если это окажет влияние - все, что я делаю, делается через https.

4 ответа

Решение

Хорошо, я решил это

В CF Administrator

Максимальный размер выходного буфера 1024

После чего произойдет сброс, который остановит работу cflocation.

Увеличьте это, и это работает.

Я понятия не имею, почему ваш код не работает, я боюсь. Можно предположить, что ColdFusion 10 заменил механизм запланированных задач и ему не нравятся некоторые перенаправления на стороне клиента.

Однако, может быть, вы все равно можете обойти ситуацию.

Планировщик ColdFusion 10 имеет концепцию связывания задач, так что когда задача завершается, запускается другая. Вы могли бы предположительно пересмотреть свой планировщик, чтобы использовать это вместо этого?

У меня была похожая проблема, но я использовал функцию location() в cfscript. Но я подозреваю, что применяется тот же принцип.

До функции location() мы вызывали функцию, которая не была заключена в <cfsilent> теги. В результате каждая строка функции, включая циклы, выводилась в виде пустой строки HTML. Когда я просмотрел исходный код, там было более 20000 строк пустого HTML-кода. Этого, вероятно, достаточно, чтобы достичь предела буфера 1024 Кбайт и вызвать сброс, который отменяет перенаправление.

Добавляя <cfsilent> добавив теги к пользовательской функции, я сократил количество пустых строк HTML до 39, и теперь функция location() работает как положено.

Чтобы определить, является ли это вашей проблемой, добавьте abort; (или же <cfabort>) непосредственно перед location(), затем просмотрите исходный код получающейся - предположительно пустой - страницы.

Вы пытались добавить CFABORT после CFLOCATION? Это то, что я всегда делаю - как код после CFLOCATION не должен быть выполнен.

Если вы проверите ответ от сервера (используя прокси-сервер Charles, Fiddler или что-то подобное), вы можете найти что-то в HTML/JS, которое предотвращает перенаправление.

Другие вопросы по тегам