Обновление страницы asp.net из асинхронного дуплексного вызова WCF - область действия объекта - ASP.NET - PullRequest
0 голосов
/ 02 июля 2010

У меня следующие сомнения. У меня есть страница «MyPage», и я объявил несколько объектов словаря в классе страницы.

Я сомневаюсь,

  1. Если я объявляю словарь как частный нестатический объект, я не могу использовать его в функциях этого класса страниц (объект обнуляется)
  2. Но если я объявлю словарь статичным, я смогу перебрать объект через функции. Но будет ли этот объект одинаковым для всех пользователей, открывших страницу прямо сейчас (предполагая, что у каждого пользователя будет экземпляр страницы, в свою очередь, имеется экземпляр класса страницы, а статические переменные класса неизменны во всех экземплярах). класса)

Правильно ли мое понимание? Как объявить объект доступным для всех функций в классе страницы и уникальным для каждого экземпляра страницы (пользователя).

Update1

Хорошо, я обнаружил, что инициализация объекта словаря в классе страницы выполняется в другом потоке (дуплексный обратный вызов WCF). Но в потоке главной страницы объект словаря по-прежнему остается нулевым (неинициализированным). Есть идеи?

Update2

Маршаллинг - полезен ли случайно?

Update3

В ответ Джону -

Спасибо за ваш ответ. Проблема, с которой я сейчас сталкиваюсь, заключается в передаче данных из класса обратного вызова WCF на стороне клиента (который будет вызываться в отдельном потоке) на страницу asp.net. Так как я могу это сделать? Состояние просмотра может помочь мне сохранить данные в запросах. Но когда обратный вызов вызывается сервером, уведомляющим об изменении, как я должен передать изменения (данные) в поток пользовательского интерфейса (страница asp.net)?

Ответы [ 4 ]

1 голос
/ 03 июля 2010

Не делайте таких вещей.

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


Вы не можете делать подобные вещи с ASP.NET!

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

В частности, если обратный вызов не происходит до завершения запроса, то метод обратного вызова не должен ссылаться на что-либо, имеющее отношение к запросу, например на вашу страницу.Это потому, что обратный вызов может вызвать после того, как запрос уже завершен!Состояние повреждено или хуже.

Если вы не заставите страницу ждать обратного вызова, вам лучше не использовать их на своих страницах.Вместо этого создайте отдельную службу Windows или что-то еще и попросите ее выдать запросы и дождаться обратного вызова.Затем страница может использовать Ajax или что-то еще, чтобы спросить, завершен ли запрос, и получить ответ после его завершения.


Если вы думаете, что слышали, как я сказал, чтобы перезвонить на страницу ASP.NET,тогда вы неправильно поняли.

Создайте службу Windows.Ваша служба Windows будет размещать службу WCF, с которой будет взаимодействовать приложение ASP.NET.Служба WCF будет отслеживать, например, кто присоединился к чату, кто печатает и т. Д.

Веб-приложение не может получать уведомления, когда происходит что-то интересное.Вместо этого веб-приложение должно будет опросить службу WCF, спрашивая, произошло ли что-нибудь интересное.Когда что-то происходит, служба WCF передает «что-то» обратно в приложение ASP.NET (или, возможно, обратно на страницу, вызываемую AJAX).

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

1 голос
/ 02 июля 2010

Вы правы во втором случае.В первом случае я предполагаю, что вы имеете в виду, что если пользователь нажимает несколько элементов управления на вашей странице, то обработчики событий видят, что словарь имеет значение null (вместо того, чтобы иметь результат из предыдущего обработчика событий).

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

1 голос
/ 02 июля 2010

Перечитывая этот вопрос, есть три отдельных конечных автомата, и ни один из них не соединен вместе - отсюда и проблема:)

  • Состояние «пользовательского состояния» - это пары ключ / значение в словаре, время их жизни охватывает несколько запросов страниц и обратных вызовов

  • Состояние «страницы», которая должна использовать данные из «пользовательского состояния». Страницы уничтожаются после каждого запроса страницы.

  • Состояние «служебного вызова», которому необходимо заполнить данные в «пользовательском состоянии». Сервисные вызовы обычно уничтожаются после каждого вызова.

Существует несколько стратегий, которые могут позволить вам соединить системы:

  • ViewState, так что конечный автомат для «пользовательского состояния» отправляется как часть состояния страницы и возвращается при обратных передачах. Это может ограничить выполнение обратных вызовов

  • Сеанс такой, что конечный автомат для «пользовательского состояния» хранится на стороне сервера, и к нему можно получить доступ с помощью ключа.

  • Статический словарь пользовательских состояний, где ключом внешнего словаря будет идентификатор «пользовательского состояния», где запрос на 1-й странице создаст запись «пользовательского состояния», и вам потребуется управлять сносом. (v. похоже на сессию - хотя работает без ASP.NET).

В каждом решении есть много нюансов - я бы посоветовал легкое чтение:)

0 голосов
/ 02 июля 2010

вы правы, что статический член будет одинаковым для всех экземпляров страницы, а значит и для всех отдельных пользователей. Вам нужно сделать его нестатичным членом, если вы хотите получить к нему доступ из каждого метода в классе. Вы должны выяснить, почему объект нулевой. Вы правильно его создаете в нужное время?

...