none
WCF & AJAX RRS feed

  • Вопрос

  • Добрый день.

    Имеется WCF служба, выполняющая сортировку массива, она связана с клиентом посредством дуального контракта и вызывает на его стороне метод, уведомляющий о шагах сортировки. Если клиентом выступает консольное приложение, то все работает отлично-сразу после подключения и вызова метода сортировки в консоли появляются сообщения от метода уведомляющего о шагах сортировки. Если же клиентом выступает ASP.NET страничка с UpdatePanel  и контролом Label помещенным в нее, то данные в Label появляются лишь после окончания сортировки. Т.е в процессе UpdatePanel, если дело конечно в этом, не обновляется.

    Заранее спасибо за любую помощь.

    29 апреля 2013 г. 3:45

Ответы

  • Дело в том, что у вас в данном случае получается трёхуровневая архитектура. Дуплексный режим связи вы можете организовать с серверным кодом, будь то консольное приложение или ещё, что под .Net, но вот запросы на клиент уже идут по принципу REST. В данном случае серверный код передаст запрошенные данные на клиент только после их получения. Так как тут связь односторонняя, сервер только отвечает на запросы клиента. "Читал еще про WCF с поддержкой AJAX" - это даёт возможность вызывать методы службы напрямую из JavaScript, но ни о какой дуплексности речи нет. Можете реализовать посредством Silverlight, вот статья по этой теме. Но всё это уже немного в прошлом (в смысле только испрользования AJAX для веб-приложений реального времени). Для дуплексной связи с использованием JavaScript лучше смотреть в сторону веб-сокетов. В частности библиотеку SignalR. Это уже совсем новый уровень веба. В настоящий момент я работаю над несколькими статьями про использование SignalR в ASP.NET, думаю в скором времени закончу.
    29 апреля 2013 г. 18:41
    Модератор

Все ответы

  • Добрый день.

    Что касается создания Update Panel:

    И еще по панеле:

    Why ASP.NET AJAX UpdatePanels are dangerous

    Надеюсь данные ресурсы помогут

    29 апреля 2013 г. 10:38
    Модератор
  • "Если же клиентом выступает ASP.NET страничка с UpdatePanel  и контролом Label помещенным в нее, то данные в Label появляются лишь после окончания сортировки. Т.е в процессе UpdatePanel, если дело конечно в этом, не обновляется. Заранее спасибо за любую помощь." - а как вы с сервисом в этом случае связываетесь, через серверный или клиентский код? Судя по тому, что вы привели, через второй вариант. Тогда так и должно быть, так как ни о каком дуплексном взаимодействии не может быть и речи.
    29 апреля 2013 г. 11:02
    Модератор
  • Дуплексное взаимодействие мне нужно, чтобы служба могла вызывать метод на клиенте, уведомляя таким образом его о наступившем событии. В данном случае-шаги сортировки. Службу я вызываю в aspx.cs файле, это,  я так понимаю, на стороне сервера получается? Как тогда вызвать на стороне клиента? Спасибо.
    29 апреля 2013 г. 11:10
  • Да, вы правильно поняли. Обычным JavaScript - ом и стандартными средствами этого не сделать. Можете использовать Silverlight.
    29 апреля 2013 г. 11:23
    Модератор
  • Yatajga, а можете подробнее рассказать, почему данные попадают в Label лишь после завершения работы метода сортировки, а не во время, как например, с консольным приложением.Заранее спасибо.
    P.S Читал еще про WCF с поддержкой AJAX. Это может помочь в данном случае?
    • Изменено nik_w 29 апреля 2013 г. 15:53
    29 апреля 2013 г. 15:31
  • Дело в том, что у вас в данном случае получается трёхуровневая архитектура. Дуплексный режим связи вы можете организовать с серверным кодом, будь то консольное приложение или ещё, что под .Net, но вот запросы на клиент уже идут по принципу REST. В данном случае серверный код передаст запрошенные данные на клиент только после их получения. Так как тут связь односторонняя, сервер только отвечает на запросы клиента. "Читал еще про WCF с поддержкой AJAX" - это даёт возможность вызывать методы службы напрямую из JavaScript, но ни о какой дуплексности речи нет. Можете реализовать посредством Silverlight, вот статья по этой теме. Но всё это уже немного в прошлом (в смысле только испрользования AJAX для веб-приложений реального времени). Для дуплексной связи с использованием JavaScript лучше смотреть в сторону веб-сокетов. В частности библиотеку SignalR. Это уже совсем новый уровень веба. В настоящий момент я работаю над несколькими статьями про использование SignalR в ASP.NET, думаю в скором времени закончу.
    29 апреля 2013 г. 18:41
    Модератор
  • Yatajga, спасибо за ответ. Попробовал я сделать клиент на WinForms. И, если с консольным клиентом все работает, то с клиентом WinForms при подключении к той же службе, вернее после вызова метода сортировки ничего не происходит, и, спустя какое-то время появляется исключение - timeout подключения. Иногда, в этот же момент такое же исключение возникает на стороне службы. При этом на службе метод сортировки даже не запускается, это я сужу по точке останова. Но, если передать в метод пустую ссылку на массив, то метод запускается. Далее, если в методе закомментировать код сортировки и начать вызывать в цикле метод обратного вызова, например так:

    for (int i = 0; i < 1000; i++) { Callback.SortProcessNotify(i, i); }

    то, тогда на клиенте эти значения видны в режиме реального времени.

    Т.е если передаем что-то в службу, то timeout, если не передаем, то работает. Из-за чего это может происходить?

    Заранее спасибо.


    30 апреля 2013 г. 13:51
  • Здравствуйте! В последнее время мало свободного времени, но стараюсь как могу. Теоретически не имеет значения у вас клиент Win Forms или консольное приложение, в обеих случаях работать должно, так как это клиенты .Net. Если можете показать код, конечно не весь, только вызова службы из консольного приложения и формы ну и сам метод службы, постараюсь посмотреть. Только задайте вопрос в новой ветке, чтобы эта не разрасталась.
    Модератор