ASP.NET JavaScript Обратные вызовы без полного PostBacks? - PullRequest
6 голосов
/ 26 августа 2008

Я собираюсь запустить довольно тяжелую функцию Ajax в приложении моей компании. Что мне нужно сделать, это сделать Ajax callback каждые несколько минут, когда пользователь был на странице.

  • Мне не нужно делать какие-либо обновления DOM до, после или во время обратных вызовов.
  • Мне не нужна никакая информация со страницы, только из файла cookie сайта, который всегда должен быть отправлен с запросами, и значение идентификатора.

Мне любопытно узнать, есть ли какой-нибудь простой и понятный способ сделать обратный вызов Ajax JavaScript на страницу ASP.NET без публикации остальной информации на странице. Я бы не хотел этого делать, если это возможно.

Я просто хочу иметь возможность вызывать один метод на странице, ничего больше.

Кроме того, я ограничен ASP.NET 2.0, поэтому я не могу использовать какие-либо новые функции ASP AJAX платформы 3.5, хотя я могу использовать расширения ASP AJAX для платформы 2.0.

UPDATE
Я решил принять ответ DanP , так как он, кажется, именно то, что я ищу. Наш сайт уже использует jQuery для некоторых вещей, поэтому я, вероятно, буду использовать jQuery для выполнения запросов, поскольку, по моему опыту, он работает намного лучше, чем ASP AXAX Framework.

Как вы думаете, что будет лучшим способом передачи данных в IHttpHandler? Должен ли я добавить переменные в строку запроса или отправить данные, которые мне нужно отправить?

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

Ответы [ 9 ]

6 голосов
/ 26 августа 2008

Если вы не хотите создавать пустую страницу, вы можете вызвать файл 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; }
        }

    }
3 голосов
/ 26 августа 2008

Какой, по вашему мнению, лучший способ передачи данных в IHttpHandler? Должен ли я добавить переменные в строку запроса или отправить данные, которые мне нужно отправить? Единственное, что мне нужно отправить, - это один идентификатор, но я не могу решить, какой лучший способ - отправить идентификатор и обработать его IHttpHandler. Я хотел бы предложить решение, которое предотвратит случайный или преднамеренный доступ человека, обладающего базовыми компьютерными навыками, к странице напрямую

Учитывая, что обратный вызов скрыт в клиентском коде, потребуется кто-то с равной решимостью получить либо строку запроса, либо запрос POST. То есть, если у них есть firebug, то вы в равной степени облажались.

Так что, в этом случае, делайте все, что вам проще (Подсказка: я бы просто использовал строку запроса).

Для обработки повторяющихся запросов / прямого доступа я бы сгенерировал ключ, который отправляется с каждым запросом. Возможно, хэш текущего времени (Нечетко, я бы сократил минуты, но не секунды из-за задержки в сети) + IP-адрес клиента.

Затем в HTTPHandler выполните тот же хеш и запускайте только в том случае, если они совпадают.

3 голосов
/ 26 августа 2008

Вы должны использовать обратные вызовы ASP.Net, которые были введены в Asp.Net 2.0. Вот статья, в которой вы должны начать:

Программная реализация обратных вызовов клиента без обратных ссылок на веб-страницах ASP.NET

Редактировать: Также посмотрите на это: Сериализация JavaScript на основе ICallback и JSON

2 голосов
/ 26 августа 2008

Мой голос тоже за предложение HTTPHandler. Я использую это часто. Поскольку он не вызывает экземпляр класса страницы, он очень легкий.

Все приемы фреймворка ASP.NET AJAX фактически создают и снова создают всю страницу в бэкэнде за вызов, поэтому они являются огромными затратами ресурсов.

Следовательно, мой типичный стиль XmlHttpRequest возвращается к HttpHandler.

2 голосов
/ 26 августа 2008

Вы не ограничены только ASP.NET AJAX, но можете использовать любую стороннюю библиотеку, такую ​​как jQuery, YUI и т. Д., Чтобы сделать то же самое. Затем вы можете просто сделать запрос на пустую страницу на вашем сайте, которая должна вернуть заголовки, которые содержат куки.

1 голос
/ 24 декабря 2009

Просто чтобы предложить другую перспективу, вы также можете использовать PageMethod на своей главной странице. У Дейва Уорда есть хороший пост, который иллюстрирует это. По сути, вы используете jQuery ajax post для вызова метода, как показано в посте Дэйва:

$.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.

1 голос
/ 26 августа 2008

Поскольку вы используете только 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);
}

EDIT

Вы также должны добавить

в конфиг. AjaxPro также хорошо работает бок о бок с APS.NET Ajax, и вы можете передавать объекты C # от клиента к серверу, если класс помечен как [Serializable]

0 голосов
/ 26 августа 2008

Вы должны использовать веб-сервис (.asmx). Microsoft ASP.NET AJAX позволяет даже автоматически создавать заглушки.

0 голосов
/ 26 августа 2008

Вы также можете использовать WebMethods, которые встроены в ajax-библиотеку asp.net. Вы просто создаете статический метод в коде страницы и вызываете его из своего Ajax.

Вот довольно простой пример того, как это сделать здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...