К сожалению, нет API, чтобы дать Вам заголовки ответа HTTP для Вашего начального запроса страницы. Это было исходным вопросом, отправленным здесь. Это было , неоднократно спрашивал также, потому что некоторые люди хотели бы получить фактические заголовки ответа исходного запроса страницы, не выпуская другой.
, Если Запрос HTTP сделан по Ajax, возможно получить заголовки ответа с getAllResponseHeaders()
метод. Это - часть XMLHttpRequest API. Чтобы видеть, как это может быть применено, проверьте fetchSimilarHeaders()
функция ниже. Обратите внимание, что это - обходное решение к проблеме, которая не будет надежна для некоторых приложений.
myXMLHttpRequest.getAllResponseHeaders();
API был определен в следующей рекомендации кандидата для XMLHttpRequest: XMLHttpRequest - Кандидат W3C Рекомендация 3 августа 2010
А именно, getAllResponseHeaders()
метод был определен в следующем разделе: w3.org: XMLHttpRequest
: getallresponseheaders()
метод
документация MDN хороша, также: developer.mozilla.org: XMLHttpRequest
.
Это не даст Вам информацию об исходном запросе страницы заголовки ответа HTTP, но это могло использоваться для высказывания образованных предположений о том, каковы те заголовки были. Больше на этом описан затем.
Этот вопрос сначала задали несколько лет назад, спросив конкретно о том, как достигнуть исходные заголовки ответа HTTP для текущая страница (т.е. та же страница, в которой JavaScript работал). Это - совершенно другой вопрос, чем простое получение заголовков ответа для любого Запроса HTTP. Для начального запроса страницы заголовки не легко доступны к JavaScript. Оценивает ли заголовок Вас, нуждаются, будет надежно и достаточно последователен, если Вы запрашиваете, чтобы та же страница снова через Ajax зависела от Вашего конкретного приложения.
следующее несколько предложений для того, чтобы обходить ту проблему.
, Если ответ в основном статичен и заголовки, как ожидают, не изменятся очень между запросами, Вы могли выполнить запрос 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);
}
Этот подход будет проблематичен, если действительно необходимо полагаться на значения, являющиеся последовательным между запросами, так как Вы не можете полностью гарантировать, что они - то же. Это собирается зависеть от Вашего определенного приложения и знаете ли Вы, что значение, в котором Вы нуждаетесь, является чем-то, что не будет изменяться от одного запроса до следующего.
существует некоторые свойства BOM (Объектная модель Браузера), который браузер определяет путем рассмотрения заголовков. Некоторые из этих свойств отражают HTTP-заголовки непосредственно (например, navigator.userAgent
установлен на значение поля HTTP User-Agent
заголовка). Путем сниффинга вокруг доступных свойств Вы могли бы быть в состоянии найти то, в чем Вы нуждаетесь, или некоторые подсказки для указания на то, что содержал ответ HTTP.
при управлении стороной сервера можно получить доступ к любому заголовку, который Вы любите, поскольку Вы создаете полный ответ. Значения могли быть переданы клиенту со страницей, спрятавшей в некоторой разметке или возможно во встроенной структуре JSON. Если бы Вы хотели иметь каждый заголовок Запроса HTTP в наличии для своего JavaScript, Вы могли бы выполнить итерации через них на сервере и передать их обратно как скрытые значения в разметке. Это, вероятно, не идеально для отправки, заголовок оценивает этот путь, но Вы могли, конечно, сделать это для определенного значения, в котором Вы нуждаетесь. Это решение возможно неэффективно также, но оно сделало бы задание при необходимости в нем.
Возможно, это не полный ответ, но из того, что я видел ...
Response.Redirect действительно заставляет код прекращать выполнение, бросая System.Threading. ThreadAbortException.
Вы можете убедиться в этом, настроив глобальную обработку ошибок в Global.Asax и протестировав Response.Redirect.
EDIT
, а вот ссылка на документацию, которая поддерживает мой ответ:
Редирект вызывает End, что вызывает Исключение ThreadAbortException при завершение.
Response.Redirect
имеет перегрузку, принимающую логический аргумент, который указывает, должен ли вызов Response.Redirect
завершить ответ . Вызов перегрузки без этого аргумента аналогичен указанию true
, чтобы указать, что ответ должен закончиться.
Завершение ответа означает, что Response.End
вызывается после ответ был изменен для выполнения перенаправления, и Response.End
генерирует исключение ThreadAbortException
для завершения текущего модуля.
Любой код после вызова Response.Redirect
никогда не вызывается (если вы не укажете false
в качестве дополнительного аргумента). Фактически,
Есть еще один параметр Response.Redirect, который называется endResponse. Установка false - хорошая идея, когда вы перенаправляете в блоке try catch, потому что контекст все еще требует контроля, чтобы быть правильным. Таким образом, ваш блок catch перехватит исключение.
Предостережение заключается в том, что, когда страница не может быть отменена, она не будет пытаться получить управление. Чаще всего это происходит с Global.asax. Так что вам не нужно беспокоиться об этом исключении в этом контексте. Если вы мне не верите, попробуйте отразить код этого метода и взглянуть на него.
Итак, чтобы ответить на ваш вопрос, не нужно много делать после Response.Redirect, когда вы устанавливаете endResponse в значение true, которое по умолчанию (т.е. вызывается методом, не использующим логическое значение).
Насколько я понимаю, при выдаче Response.Redirect () следующий за ним код не будет выполняться. Если задуматься, есть смысл не выполнять. По сути, вы сообщаете своему коду, что хотите пойти куда-нибудь еще.
Пример: Думайте об этом как о заказе недорогой еды в McDonalds. После того, как вы закажете его, и они начнут наполнять ваш напиток, вы передумаете и скажете: «Знаете что, забудьте мой заказ. Я собираюсь перенаправить себя к Венди». В этот момент они перестанут готовить вам картофель фри и гамбургер, потому что ... ну ... вы решили пойти куда-то еще - т.е. перенаправить ответ.