Я собираюсь запустить довольно тяжелую функцию Ajax в приложении моей компании. Что мне нужно сделать, так это выполнять обратный вызов Ajax каждые несколько минут, когда пользователь был на странице.
Мне любопытно узнать, есть ли какой-нибудь чистый и простой способ сделать обратный вызов JavaScript Ajax на страницу ASP.NET без отправки остальной информации на странице. Я бы не хотел этого делать, если это возможно.
Я действительно просто хочу иметь возможность вызывать один метод на странице, и ничего больше.
Кроме того, я ограничен ASP.NET 2.0, поэтому я не могу использовать какие-либо новые функции ASP AJAX фреймворка 3.5, хотя я могу использовать расширения ASP AJAX для фреймворка 2.0.
ОБНОВИТЬ
Я решил принять ответ DanP, поскольку он, кажется, именно то, что я ищу. Наш сайт уже использует jQuery для некоторых вещей, поэтому я, вероятно, буду использовать jQuery для выполнения запросов, поскольку, по моему опыту, он работает намного лучше, чем фреймворк AJAX ASP.
Как вы думаете, какой метод передачи данных в IHttpHandler будет лучшим? Должен ли я добавлять переменные в строку запроса или POST данные, которые мне нужно отправить?
Я думаю, что единственное, что мне нужно отправить, - это один идентификатор, но я не могу решить, какой лучший метод - отправить идентификатор и обработать его с помощью IHttpHandler. Я хотел бы предложить решение, которое предотвратит случайное или намеренное прямое или намеренное посещение страницы человеком с базовыми навыками работы с компьютером или повторение запросов. Это возможно?





Вы не ограничены только ASP.NET AJAX, но можете использовать любую стороннюю библиотеку, такую как jQuery, YUI и т. д., Чтобы делать то же самое. Затем вы можете просто отправить запрос на пустую страницу своего сайта, которая должна вернуть заголовки, содержащие файлы cookie.
Если вы не хотите создавать пустую страницу, вы можете вызвать файл IHttpHandler (ashx):
public class RSSHandler : IHttpHandler
{
public void ProcessRequest (HttpContext context)
{
context.Response.ContentType = "text/xml";
string sXml = BuildXMLString(); //not showing this function,
//but it creates the XML string
context.Response.Write( sXml );
}
public bool IsReusable
{
get { return true; }
}
}
Вы также можете использовать WebMethods, которые встроены в библиотеку asp.net ajax. Вы просто создаете статический метод в коде страницы и вызываете его из своего Ajax.
Вот довольно простой пример того, как это сделать здесь
Вам следует использовать веб-службу (.asmx). С помощью Microsoft ASP.NET AJAX вы даже можете автоматически создавать заглушки.
Вы должны использовать обратные вызовы ASP.Net, которые были представлены в Asp.Net 2.0. Вот статья, которая должна вас подготовить:
Программная реализация клиентских обратных вызовов без обратной передачи на веб-страницах ASP.NET
Обновлено: также посмотрите на это: ICallback и сериализация JavaScript на основе JSON
Я тоже голосую за предложение HTTPHandler. Я часто этим пользуюсь. Поскольку он не вызывает экземпляр класса страницы, он очень легкий.
Все уловки фреймворка ASP.NET AJAX фактически создают и снова создают всю страницу на бэкэнде для каждого вызова, поэтому они требуют огромных ресурсов.
Следовательно, мой типичный стиль XmlHttpRequest вернулся к HttpHandler.
What do you think would be the best method of transferring data to the IHttpHandler? Should I added variables to the query string or POST the data I need to send? The only thing I think I have to send is a single ID, but I can't decide what the best method is to send the ID and have the IHttpHandler handle it. I'd like to come up with a solution that would prevent a person with basic computer skills from accidentally or intentionally accessing the page directly
Учитывая, что обратный вызов скрыт в клиентском коде, потребуется кто-то с равной решимостью получить либо строку запроса, либо запрос POST. IE, если у них есть firebug, ваш тоже облажался.
Итак, в этом случае делайте то, что вам проще (подсказка: я бы просто использовал строку запроса).
Чтобы обрабатывать повторяющиеся запросы / прямой доступ, я бы сгенерировал ключ, который отправляется с каждым запросом. Возможно, хеш текущего времени (Нечетко, я бы сократил до минут, но не до секунд из-за задержки в сети) + IP-адрес клиента.
Затем в HTTPHandler выполните тот же хеш и запускайте только в том случае, если они совпадают.
Поскольку вы используете только ASP.NET 2.0, я бы порекомендовал AjaxPro, который создаст файл .ashx. Все, что вам нужно сделать, это загрузить AjaxPro.dll на свой веб-сайт. Я разработал целое приложение с AjaxPro и обнаружил, что оно работает очень хорошо. Он использует сериализацию для передачи объектов туда и обратно.
Это всего лишь пример того, как его просто использовать.
namespace MyDemo
{
public class Default
{
protected void Page_Load(object sender, EventArgs e)
{
AjaxPro.Utility.RegisterTypeForAjax(typeof(Default));
}
[AjaxPro.AjaxMethod]
public DateTime GetServerTime()
{
return DateTime.Now;
}
}
}
Вызвать его через JavaScript так же просто, как
function getServerTime()
{
MyDemo._Default.GetServerTime(getServerTime_callback); // asynchronous call
}
// This method will be called after the method has been executed
// and the result has been sent to the client.
function getServerTime_callback(res)
{
alert(res.value);
}
РЕДАКТИРОВАТЬ
Вы также должны добавить
К файлу config. AjaxPro также хорошо работает бок о бок с APS.NET Ajax, и вы можете передавать объекты C# от клиента к серверу, если класс помечен как [Serializable]
Чтобы предложить другую точку зрения, вы также можете использовать PageMethod на своей главной странице. У Дэйва Уорда есть хороший пост, что иллюстрирует this. По сути, вы используете сообщение jQuery ajax для вызова метода, как показано в сообщении Дейва:
$.ajax({
type: "POST",
url: "Default.aspx/GetFeedburnerItems",
// Pass the "Count" parameter, via JSON object.
data: "{'Count':'7'}",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(msg) {
BuildTable(msg.d);
}
});
Нет необходимости в расширениях Asp.Net Ajax.