Мне нужно общаться между 2 страницами, не обновляя страницу, с помощью ajax, когда на стороне сервера возникает событие - PullRequest
0 голосов
/ 27 апреля 2010

Чтобы прояснить, я пробовал решения с updatepanel / scriptmanager, но я НЕ хочу их использовать. Я хочу сделать эти сообщения jquery-ajax и ничего больше.

Допустим, такой сценарий.

У нас есть глобальное событие:

public static class CustomGlobalEvents

{

    public delegate void SpecialEventRaisedEventHandler(object sender, string type, string msg);

    public static event SpecialEventRaisedEventHandler SpecialEventRaised;

    public static void SpecialEvent(object sender, string type, string msg)
    {
        if (SpecialEventRaised != null)
            SpecialEventRaised(sender, type, msg);
    }

}

У нас есть 2 веб-страницы: reciever.aspx и sender.aspx.

reciever.aspx имеет следующий код:

protected void Page_Load(object sender, EventArgs e)

{

    if(!IsPostBack)
    {
        CustomGlobalEvents.SpecialEventRaised += new CustomGlobalEvents.SpecialEventRaisedEventHandler(CustomGlobalEvents_SpecialEventRaised);
    }

}

void CustomGlobalEvents_SpecialEventRaised(object sender, string type, string msg)
{
    // do something
}

sender.aspx имеет следующий код:

protected void Page_Load(object sender, EventArgs e)
{

    if(!IsPostBack)

    {
         CustomGlobalEvents.SpecialEvent(this.Page, "type", "msg");
    }
}

В обработчике событий reciever.aspx для специального события CustomGlobalEvents_SpecialEventRaised я хочу запустить javascript на странице reciever.aspx.

Например, сделать сообщение jquery ajax и обновить информацию на странице.

Я пытался внедрить JavaScript в менеджер сценариев, но так как менеджер сценариев не находится в асинхронном состоянии (даже если я принудительно обновляю updatePanel.Update();), сценарий не попадает на страницу.

Другая идея состояла в том, чтобы попытаться инициировать generichandler напрямую, но это привело к sender.aspx получению ответа вместо получателя со следующим кодом:

MyGenericHandler myGenericHandler = new MyGenericHandler();
myGenericHandler.ProcessRequest(HttpContext.Current);

, что может иметь смысл, поскольку именно sender.aspx фактически инициировал событие.

С этим ничего не происходит вообще:

MyGenericHandler myGenericHandler = new MyGenericHandler();
myGenericHandler.ProcessRequest(this.Context);

Лучшим способом было бы явно запустить generichandler и каким-то образом заставить страницу reciever.aspx получить ответ. Следующая лучшая вещь - это сказать reciever.aspx, что нужно запустить метод javascript.

Я пытался создать httpmodule, чтобы попытаться что-то подключить, но не получилось.

Лучшее другое решение, которое я видел до сих пор, это на самом деле с помощью jquery отправлять ajax-пост каждые x секунд. Но это определенно НЕ то, что я хочу. Я хочу запустить его, когда он должен быть запущен (когда происходит событие на стороне сервера).

Решения, работающие с IIS6 или IIS7, подойдут любые, но это ASP.NET 3.5, а не MVC.

Есть идеи?

Редактировать: очевидно, не поддерживает открытые делегаты-тега stackoverflow ...:)

1 Ответ

2 голосов
/ 08 апреля 2011

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

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