ASP.NET: Что, оказывается, кодирует после Ответа. Перенаправление (…)?

К сожалению, нет API, чтобы дать Вам заголовки ответа HTTP для Вашего начального запроса страницы. Это было исходным вопросом, отправленным здесь. Это было , неоднократно спрашивал также, потому что некоторые люди хотели бы получить фактические заголовки ответа исходного запроса страницы, не выпуская другой.


Для Запросов Ajax:

, Если Запрос HTTP сделан по Ajax, возможно получить заголовки ответа с getAllResponseHeaders() метод. Это - часть XMLHttpRequest API. Чтобы видеть, как это может быть применено, проверьте fetchSimilarHeaders() функция ниже. Обратите внимание, что это - обходное решение к проблеме, которая не будет надежна для некоторых приложений.

myXMLHttpRequest.getAllResponseHeaders();

Это не даст Вам информацию об исходном запросе страницы заголовки ответа HTTP, но это могло использоваться для высказывания образованных предположений о том, каковы те заголовки были. Больше на этом описан затем.


Получение заголовка оценивает от Начального Запроса Страницы:

Этот вопрос сначала задали несколько лет назад, спросив конкретно о том, как достигнуть исходные заголовки ответа HTTP для текущая страница (т.е. та же страница, в которой JavaScript работал). Это - совершенно другой вопрос, чем простое получение заголовков ответа для любого Запроса HTTP. Для начального запроса страницы заголовки не легко доступны к JavaScript. Оценивает ли заголовок Вас, нуждаются, будет надежно и достаточно последователен, если Вы запрашиваете, чтобы та же страница снова через Ajax зависела от Вашего конкретного приложения.

следующее несколько предложений для того, чтобы обходить ту проблему.


1. Запросы на Ресурсах, которые являются в основном статичны

, Если ответ в основном статичен и заголовки, как ожидают, не изменятся очень между запросами, Вы могли выполнить запрос Ajax для той же страницы, Вы в настоящее время включены и предполагаете, что они, они - те же значения, которые были частью ответа HTTP страницы. Это могло позволить Вам получать доступ к заголовкам, Вам нужно использование хорошего XMLHttpRequest API, описанного выше.

function fetchSimilarHeaders (callback) {
    var request = new XMLHttpRequest();
    request.onreadystatechange = function () {
        if (request.readyState === XMLHttpRequest.DONE) {
            //
            // The following headers may often be similar
            // to those of the original page request...
            //
            if (callback && typeof callback === 'function') {
                callback(request.getAllResponseHeaders());
            }
        }
    };

    //
    // Re-request the same page (document.location)
    // We hope to get the same or similar response headers to those which 
    // came with the current page, but we have no guarantee.
    // Since we are only after the headers, a HEAD request may be sufficient.
    //
    request.open('HEAD', document.location, true);
    request.send(null);
}

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


2. Сделайте Выводы

существует некоторые свойства BOM (Объектная модель Браузера), который браузер определяет путем рассмотрения заголовков. Некоторые из этих свойств отражают HTTP-заголовки непосредственно (например, navigator.userAgent установлен на значение поля HTTP User-Agent заголовка). Путем сниффинга вокруг доступных свойств Вы могли бы быть в состоянии найти то, в чем Вы нуждаетесь, или некоторые подсказки для указания на то, что содержал ответ HTTP.


3. Спрячьте их

при управлении стороной сервера можно получить доступ к любому заголовку, который Вы любите, поскольку Вы создаете полный ответ. Значения могли быть переданы клиенту со страницей, спрятавшей в некоторой разметке или возможно во встроенной структуре JSON. Если бы Вы хотели иметь каждый заголовок Запроса HTTP в наличии для своего JavaScript, Вы могли бы выполнить итерации через них на сервере и передать их обратно как скрытые значения в разметке. Это, вероятно, не идеально для отправки, заголовок оценивает этот путь, но Вы могли, конечно, сделать это для определенного значения, в котором Вы нуждаетесь. Это решение возможно неэффективно также, но оно сделало бы задание при необходимости в нем.

38
задан Brandon 9 August 2009 в 22:02
поделиться

4 ответа

Возможно, это не полный ответ, но из того, что я видел ...

Response.Redirect действительно заставляет код прекращать выполнение, бросая System.Threading. ThreadAbortException.

Вы можете убедиться в этом, настроив глобальную обработку ошибок в Global.Asax и протестировав Response.Redirect.

EDIT

, а вот ссылка на документацию, которая поддерживает мой ответ:

Редирект вызывает End, что вызывает Исключение ThreadAbortException при завершение.

Метод HttpResponse.Redirect (String, Boolean) (System.Web)

30
ответ дан 27 November 2019 в 03:23
поделиться

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

Завершение ответа означает, что Response.End вызывается после ответ был изменен для выполнения перенаправления, и Response.End генерирует исключение ThreadAbortException для завершения текущего модуля.

Любой код после вызова Response.Redirect никогда не вызывается (если вы не укажете false в качестве дополнительного аргумента). Фактически,

51
ответ дан 27 November 2019 в 03:23
поделиться

Есть еще один параметр Response.Redirect, который называется endResponse. Установка false - хорошая идея, когда вы перенаправляете в блоке try catch, потому что контекст все еще требует контроля, чтобы быть правильным. Таким образом, ваш блок catch перехватит исключение.

Предостережение заключается в том, что, когда страница не может быть отменена, она не будет пытаться получить управление. Чаще всего это происходит с Global.asax. Так что вам не нужно беспокоиться об этом исключении в этом контексте. Если вы мне не верите, попробуйте отразить код этого метода и взглянуть на него.

Итак, чтобы ответить на ваш вопрос, не нужно много делать после Response.Redirect, когда вы устанавливаете endResponse в значение true, которое по умолчанию (т.е. вызывается методом, не использующим логическое значение).

3
ответ дан 27 November 2019 в 03:23
поделиться

Насколько я понимаю, при выдаче Response.Redirect () следующий за ним код не будет выполняться. Если задуматься, есть смысл не выполнять. По сути, вы сообщаете своему коду, что хотите пойти куда-нибудь еще.

Пример: Думайте об этом как о заказе недорогой еды в McDonalds. После того, как вы закажете его, и они начнут наполнять ваш напиток, вы передумаете и скажете: «Знаете что, забудьте мой заказ. Я собираюсь перенаправить себя к Венди». В этот момент они перестанут готовить вам картофель фри и гамбургер, потому что ... ну ... вы решили пойти куда-то еще - т.е. перенаправить ответ.

1
ответ дан 27 November 2019 в 03:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: