Bezdepbonusu7Программирование: статьи и ответы

Вопрос

ColdFusion - CFThread не удалось установить заголовок?

Автор вопроса: pmascariОтветов: 2

Я получаю странную ошибку от CFThread. Я обернул его вокруг функции, которая отлично работает вне CFThread. Но для завершения требуется около 20 секунд, поэтому я запускаю его в CFThread, затем CFLocation пользователя на новую страницу и предупреждаю их, когда это будет сделано.

Он также завернут в CFTRY, чтобы отправить мне электронное письмо в случае возникновения проблемы.

Я получаю электронные письма, в которых находится CFCATCH.Message:

"CFThread не удалось установить заголовок для ответа, так как запрос уже выполнен"

Я не могу найти ссылку на подобную ошибку в Google. Я предполагаю, что ему не нравится тот факт, что я использую CFLocation сразу после вызова Thread. Итак, черт возьми, я попытался вместо этого использовать META REFRESH для перенаправления пользователя. Тот же результат ошибки.

Любые идеи?

ОБНОВЛЕНО 08.07.13:

Код здесь:

<cfset admsID = replace(createUUID(),"-","","all")>
<cfthread action="run" name="runADMS#admsID#" admsID="#admsID#" formstruct="#form#">
<cftry>
<cfobject component="cfc.AutoDealerBrandMarketShare" name="adms">
<cfset rptPDF = adms.buildReport(dealer=formstruct.chosenDealer,mkt=formstruct.DMACode,make=formstruct.Make,rptID=admsID)>
<cfcatch type="any">
<cfmail to="[email protected]" from="[email protected]" subject="ADMS Error">
Error occurred running a Polk Auto Dealer Market Share report.
#cfcatch.Message#
#cfcatch.detail#
</cfmail>
</cfcatch>
</cftry>
</cfthread>
<cflocation url="http://www.usercanwaithere.com">
  • Можете ли вы опубликовать код, чтобы мы могли воспроизвести проблему самостоятельно? Matt Busche 06.07.2013
  • Кроме того, взгляните на журналы исключений, которые генерирует CF, так как они могут указать вам на строку кода. Кроме того, используя инструменты разработчика Fiddler или Chrome, взгляните на ответ HTTP при запуске функции вне CFTHREAD и посмотрите, устанавливаются ли какие-либо другие заголовки. barnyr 06.07.2013
  • Я обновил пост с кодом. Я также посмотрел в журналах и не могу найти ничего, относящегося к этой ошибке. pmascari 08.07.2013
  • Этот cflocation находится только после потока в коде - поток выполняется асинхронно с ним (и, вероятно, завершится после его выполнения и, следовательно, после отправки ответа); это не имеет значения и не является причиной. Peter Boughton 08.07.2013
  • Сообщение об ошибке довольно явное и похоже на то, что говорит Генри, поэтому загляните внутрь buildReport - оно будет содержать (или вызывать какой-либо другой код, который содержит) cfheader или другое cflocation или какую-то другую эквивалентную конструкцию, которая пытается установить HTTP. заголовок. Peter Boughton 08.07.2013

responseheadercoldfusioncfthread

Ответы

Ответ 1 · рейтинг 5 · Henry

Если подумать, то это имеет смысл, потому что cfthread может продолжать работать после того, как ответ был отправлен клиенту. Поэтому устанавливать что-то новое в заголовке уже не имеет смысла, потому что "корабль уплыл".

Как вы знаете, CFThread позволяет создавать новый поток, выполняющий некоторую обработку параллельно с запросом. Этот поток может продолжать работать даже после завершения запроса. Поскольку этот поток не подключен к HTTP-запросу, который его породил, любая операция, выполняемая из потока, который пытается что-то изменить в HTTP-запросе/ответе, например установка заголовка, файла cookie, кода ответа и т. д., не имеет смысла и не должна выполняться. .

Поэтому не следует использовать cfcookie, cfheader, cfcontent и т. д. внутри cfthread, так как это может привести к непредсказуемому поведению.

-- Рупеш Кумар, инженер Adobe ColdFusion

Ответ 2 · pmascari

Нашел. Просмотрел код и обнаружил случайный тег CFHEADER над одним из тегов CFDocument.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы