Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сервисы и static в сборке 
:(
    Опции темы
Ser2005
Дата 6.6.2005, 10:35 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Прошу подсказать.
Имеем ряд сервисов, которые используют (вернее мы хотим, чтобы использовали) static член одного класса (сборка - dll-модуль помещен в GAC). При работе с различными методами одного сервиса все прекрасно, в статике мы имеем то, что положили. Но при обращении к нему из другого сервиса этот статик-член оказывается пуст.
Как с этим можно бороться? Каким бубном звякнуть (может быть своим о стенку)?

  Вверх
mr.DUDA
Дата 6.6.2005, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Статик-поле сохраняется только в рамках одного AppDomain.

Если нужно взаимодействовать между процессами, необходим другой вариант.


--------------------
user posted image
PM MAIL WWW   Вверх
Ser2005
Дата 7.6.2005, 06:18 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











to mr.DUDA
Цитата
Статик-поле сохраняется только в рамках одного AppDomain.


Т.е. при использовании сервисов работа идет в разных доменах?

К сожалению, сервисы для нас совсем новая область. Не могли бы вы хоть немного "подтолкнуть" в нужном направлении. Нам необходимо имееть некую общую область памяти, к которой бы имели доступ работающие сервисы.

  Вверх
mr.DUDA
Дата 7.6.2005, 07:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Цитата(Ser2005 @ 7.6.2005, 06:18)
Нам необходимо имееть некую общую область памяти, к которой бы имели доступ работающие сервисы.

Уточните, пжлст, Windows-сервисы или ASP.NET Web Services ?


--------------------
user posted image
PM MAIL WWW   Вверх
Ser2005
Дата 7.6.2005, 07:53 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











ASP.NET Web Services
  Вверх
mr.DUDA
Дата 7.6.2005, 09:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



В таком случае, что-то работает не так, потому что все веб-сервисы работают в рамках одного процесса (если конечно администратор не настроил IIS на использование нескольких процессов).

Вот пример, он реально показывает, что оба веб-сервиса работают с одной копией статической переменной:

GlobalClass.cs
Код

using System;

namespace Test
{
    public class GlobalClass
    {
        public static int GlobalVar = 123;
    }
}


Service1.asmx.cs
Код

using System;
using System.Web;
using System.Web.Services;

namespace Test
{
    public class Service1 : System.Web.Services.WebService
    {
        public Service1()
        {
        }

        [WebMethod]
        public int Get()
        {
            return GlobalClass.GlobalVar;
        }

        [WebMethod]
        public void Set(int val)
        {
            GlobalClass.GlobalVar = val;
        }
    }
}


Service2.asmx.cs
Код

using System;
using System.Web;
using System.Web.Services;

namespace Test
{
    public class Service2 : System.Web.Services.WebService
    {
        public Service2()
        {
        }

        [WebMethod]
        public int Get()
        {
            return GlobalClass.GlobalVar;
        }

        [WebMethod]
        public void Set(int val)
        {
            GlobalClass.GlobalVar = val;
        }
    }
}


При обращении через браузер, методы Get и Set обоих веб-сервисов возвращают и устанавливают текущее значение GlobalClass.GlobalVar


--------------------
user posted image
PM MAIL WWW   Вверх
Ser2005
Дата 7.6.2005, 11:47 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Попытался воспроизвести ваш пример. Результат такой, как был у нас ранее. Т.е. каждый из этих двух сервисов работает со своей копией GlobalClass и возвращают свой, отличный от другого, результат.
IIS с момента установки не переконфигурировался.
ОС - WinXP.
  Вверх
mr.DUDA
Дата 7.6.2005, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Странно, т.к. у меня точно такая же конфигурация и всё работает, пример рабочий.


--------------------
user posted image
PM MAIL WWW   Вверх
SergKO
Дата 8.6.2005, 05:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 231
Регистрация: 14.3.2005

Репутация: нет
Всего: 20



Какая у вас версия IIS? У нас - 5.1.
Не может быть проблема в этом:

Группировка приложений в пул в службах IIS версии 6.0


PM MAIL   Вверх
SergKO
Дата 8.6.2005, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 231
Регистрация: 14.3.2005

Репутация: нет
Всего: 20



Прошу прощения Ser2005 = SergKO.

Совсем забыл, что регистрировался на форуме.

Предыдущее сообщение адресовано mr.DUDA

Если я правильно понял, то IIS 5.1 запускает сервисы в разных процессах.
PM MAIL   Вверх
arilou
Дата 9.6.2005, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 21
Всего: 61



Цитата
Если я правильно понял, то IIS 5.1 запускает сервисы в разных процессах.

На скриншоте показано, что для виртуальной директории EP выставлен Application Protection - Medium. Смотрим IIS Help:

Цитата
Application Protection
Select whether applications are run in the same process as Web services (low), in an isolated pooled process in which other applications are also run (medium), or in an isolated process separate from other processes (high).


Читаем и понимаем, что веб-сервисы выполняются в рамках процесса IIS. Это означает, что внутри процесса IIS создается .NET host, в котором выполняется код (вероятно, через aspnet_isapi.dll). Далее.

ASP.NET использует такое понятие .NET fx как Application Domain. AppDomain - это изолированный контекст выполнения внутри одного процесса. Каждое приложение в ASP.NET выполняется в своем AppDomain. Это нужно для того, чтобы их изолировать друг от друга. Веб-сервис входит в состав ASP.NET приложения, соответственно, если два веб-сервиса находятся в одном приложении, то они работают в одном AppDomain и имееют доступ к общим статическим переменным.

Если же сервисы находятся в разных приложениях (читай, разных проектах в VS.NET), то они будут работать в разных AppDomain'ах, и, как сказал mr.DUDA, у них будет своя копия набора статических переменных.

Любое взаимодействие между двумя разными контекстами выполнения должно использовать тот или иной механизм, например, Remoting. Я бы предложил вместо статических переменных использовать Remoting объект с синхронизированным доступом. Дело в том, что нельзя забывать, что веб-сервисы (как и веб-приложения) работают в многопоточной среде, и поэтому использование статических переменных должно быть мотивировано, а доступ к ним - синхронизирован.

Надеюсь, что помог.

Это сообщение отредактировал(а) arilou - 9.6.2005, 14:44

Присоединённый файл ( Кол-во скачиваний: 8 )
Присоединённый файл  AppConfig.GIF 23,54 Kb


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
SergKO
Дата 10.6.2005, 07:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 231
Регистрация: 14.3.2005

Репутация: нет
Всего: 20



to arilou
Огромное спасибо за разъяснение.
К выводу использовать Remoting мы уже пришли сами, но эти выводы были сделаны на основе наших предположений и догадок, т.е. ПОКА без достаточного понимания.

to mr.DUDA
Спасибо за участие и помощь.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0573 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.