Выдает ошибку из cfc - cflocation не работает изнутри onerror () - PullRequest
0 голосов
/ 28 января 2012

Редактировать: важной частью может быть то, что я вызываю метод cfc через ajax ...

Я вызываю метод cfc через ajax, который возвращает данные для использования в таблице jqgrid.Внутри метода cfc я пытаюсь настроить обработку ошибок, чтобы вместо того, чтобы просто отказывать и не показывать пользователю никаких проблем, я отправляю пользователей на страницу ошибок, которая определяется как error.cfm в корневом каталоге.и который прямо сейчас включает в себя некоторые шаблоны HTML.Внутри Application.cfc я определил свой метод onError () следующим образом:

<cffunction name="onError" returnType="void" output="false"  >
    <cfargument name="exception" required="true"  >
    <cfargument name="eventname" type="string" required="true"  >

    <cfmail to="#application.REGISTRATION_NOTIFICATION#" from="outgoing address" subject="Error">

    </cfmail>

    <cflocation url="../index.cfm?file=error.cfm" addToken="false"  /> 

Когда я выкидываю ошибку из метода cfc, независимо от того, находится он внутри cfcatch или нет, Chromeсообщает, что меня действительно отправили в index.cfm со значением STATUS = 200, и в ответе правильно отображается html, который находится внутри шаблона error.cfm.Однако браузер на самом деле не переходит на страницу.

Дело в том, что если я изменю местоположение на

<cflocation url="index.cfm?file=error.cfm" addToken="false"  /> 

и выдам ошибку со страницы, которая вызывала cfc,вместо cfc, cflocation работает как положено.Кроме того, если я использую cfinvoke для вызова cfc с исходной страницы, вместо вызова ajax, cflocation работает.Так что это должно быть как-то связано с тем, что я делаю вызов cfc через ajax, а не вызываю его изнутри CF.Так чего мне здесь не хватает?

ps это происходит в Chrome, IE и FF.Я использую CF 9.0.1 с исправлениями, без фреймворков.Вот подмножество выходных данных из панели «Сеть» Chrome в заголовках для ссылающейся страницы:

URL-адрес запроса: http://localhost/sitename/cfc/method.cfc

Метод запроса: GET

Код состояния:302 Временно перемещено

Заголовки запроса: просмотр источника

Принять: application / json, text / javascript, / ;q = 0,01

Accept-Charset: ISO-8859-1, utf-8; q = 0,7, *; q = 0,3

Accept-Encoding: gzip, deflate, sdch

Accept-Language: en-US, en; q = 0,8

Соединение: keep-alive

Cookie: CFID = 11801;CFTOKEN = 90037336;LASTVISIT = 1327852981759

Хост: localhost

Источник: http://localhost/sitename/index.cfm?file=referringfile.cfm

Пользователь-агент: Mozilla / 5.0 (Windows NT 6.1; WOW64) AppleWebKit / 535.7 (KHTML, как Gecko) Chrome/16.0.912.77 Safari / 535.7

X-Requested-With: XMLHttpRequest

Запрос параметров строки запроса URL-адрес в кодировке

метод: getPartNumbers

filter: {"page": 1, "sessionSQL": "1327834969791", "filterRows": [{"FIELD_NAME": "PART_NUMBER", "OPERAND": "EQUALS", "FIELD_VALUE": "11 06 01"}]}

_search: false

nd: 1327835014639

строк: 100

страница: 1

sidx: PART_NUMBER

sord: desc

Заголовки ответа вид источника

Content-Type: text / html;charset = UTF-8

Дата: вс, 29 января 2012 11:03:34 GMT

Расположение: ../ index.cfm? file = error.cfm

Постоянный-Auth: true

Сервер: Microsoft-IIS / 7.5

Set-Cookie: LASTVISIT = 1327853014657; истекает = пт, 27 июля 2012 г. 11:03:34 GMT; путь =/

Кодирование передачи: chunked

X-Powered-By: ASP.NET

И для страницы error.cfm:

URL-адрес запроса: http://localhost/sitename/index.cfm?file=error.cfm

Метод запроса: GET

Код состояния: 200 OK

Запрос заголовков представления источника

Прием: application / json, текст/ javascript, / ;q = 0,01

Accept-Charset: ISO-8859-1, utf-8; q = 0,7, *; q = 0,3

Accept-Encoding: gzip, deflate, sdch

Accept-Language: en-US, en; q = 0,8

Авторизация: согласование blahblahblahblah

Соединение: keep-alive

Cookie: CFID = 11801;CFTOKEN = 90037336;LASTVISIT = 1327716554490

Хост: localhost

Реферер: http://localhost/sitename/index.cfm?file=filename/filename.cfm&Config=filename

Пользователь-агент: Mozilla / 5.0 (Windows NT 6.1; WOW64) AppleWebKit / 535,7 (KHTML, как Gecko) Chrome / 16.0.912.77 Safari / 535.7

X-Requested-With: XMLHttpRequest

Query String Параметры просмотра URL в кодировке

файл: error.cfm

Заголовки ответа вид источника

Content-Type: Текст / html; charset = UTF-8 Дата: пт, 27 января 2012 21: 09: 14

GMT Постоянный-Auth: true Сервер: Microsoft-IIS / 7.5

Set-Cookie: LASTVISIT = 1327716554533; срок действия = ср., 25 июля 2012 г. 21:09:14 GMT; путь = /

Transfer-Encoding: фрагментированный

X-Powered-By: ASP.NET

Ответы [ 4 ]

0 голосов
/ 31 января 2012

Я думаю, что получил ответ здесь:

Обработка ошибок удаленного API с помощью метода события OnError Application.cfc

Думаю, я знаю достаточно Ajax, чтобы быть опасным: (

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

0 голосов
/ 30 января 2012

Возможно, приведенная ниже ссылка может помочь вам

http://www.bennadel.com/blog/2050-Changes-In-CFLocation-OnRequestEnd-Behavior-In-ColdFusion-9-s-Application-cfc.htm

0 голосов
/ 30 января 2012

Если вы используете AJAX, результирующий вывод не будет отображаться, если он не связан с элементом HTML в документе HTML с использованием CF.

Можете ли вы увидеть какой-либо контент в теле ответа (сущности) для страницы ошибки, используя chrome, когда вы делаете запрос AJAX?

Я так понимаю, это сервер приложений Bluedragon?

0 голосов
/ 28 января 2012

Редактировать: Извините, неправильно прочитал вопрос ...

ОБНОВЛЕНО: Вы можете попробовать включить шаблон для обработки cflocation, выполнение cflocation внутри приложения. Cfc может быть запрещено, поскольку это происходит до того, как запрос запущен?

Application.cfc

 component {

    this.name = 'errorTest';

    public void function onError(required any Exception, required string EventName) {

        include 'errorRedirect.cfm';
    }
}

index.cfm (в коде для демо есть ошибка)

<cfscript>
a = form.nonExistentVariable;
</cfscript>

errorRedirect.cfm

<cflocation url="error.html">

error.html

<h1>Sorry, An Error has Occurred. </h1>

test.cfc (test with test.cfc? Method = test to demo cfc error)

component {

remote function test () {

    a = form.DoesNotExist;
}
}
...