Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / WebService монопольный запуск, контроль выполнения / 18 сообщений из 18, страница 1 из 1
11.04.2014, 08:37
    #38611979
Volochkova
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WebService монопольный запуск, контроль выполнения
Доброго дня.

Есть веб сервис, его могут запускать 5 человек, у каждого свой логин и пароль.
Необходимо контролировать чтобы в конкретный момент времени был запущен только один раз.
Сервис обрабатывает данные, и отключение клиента - не всегда ( тут я конечно могу ошибиться, проверяла на студии и localhost server) прекращает загрузку данных.

Сделать static класс и хранить в нем кол-во текущих запусков. Как вариант, но может есть какие то настройки для Севриса, что то типа
Код: c#
1.
[WebMethod(EnableSession = true)]


Чтобы пока сервис работет, другой не мог его запустить.

Или задам вопрос по другому, можно ли как то получить список запущенных сервисов и остановить их?

Спасибо.
ASP.NET 4.0, C#. WebForms
...
Рейтинг: 0 / 0
11.04.2014, 10:26
    #38612068
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WebService монопольный запуск, контроль выполнения
Volochkova,

1. создавать и проверять глобальный EventWaitHandle
2. проверять, не занят ли порт (т.е. сервис просто не запустится, если порт занят)
...
Рейтинг: 0 / 0
11.04.2014, 14:57
    #38612439
Volochkova
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WebService монопольный запуск, контроль выполнения
hVosttVolochkova,

1. создавать и проверять глобальный EventWaitHandle
2. проверять, не занят ли порт (т.е. сервис просто не запустится, если порт занят)

Можно подробнее про занятый порт?
...
Рейтинг: 0 / 0
11.04.2014, 15:36
    #38612507
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WebService монопольный запуск, контроль выполнения
VolochkovaМожно подробнее про занятый порт?

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

в целом, лучше использовать механизмы синхронизации (пункт 1), это не сложно:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
            EventWaitHandle globalWaitHandle;
            // проверить, не запущен ли уже кем-то сервис
            if (TryOpenExistingEventWaitHandle("E7D85C00-C2EB-496F-8E8C-BD399E118258", out globalWaitHandle))
            {
                // сервис уже запущен другим приложением
                // ...
            }
            // ок, захватываем глобальный EventWaitHandle по имени (я выбрал сгенерированный GUID)
            globalWaitHandle = new EventWaitHandle(false, EventResetMode.AutoReset, "E7D85C00-C2EB-496F-8E8C-BD399E118258");
            // запускаем свой сервис
...
Рейтинг: 0 / 0
11.04.2014, 15:46
    #38612521
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WebService монопольный запуск, контроль выполнения
VolochkovaСервис обрабатывает данные, и отключение клиента - не всегда ( тут я конечно могу ошибиться, проверяла на студии и localhost server) прекращает загрузку данных.Сервису обычно монопенисуально то, отключился клиент, или нет. Он закончит свою работу.
...
Рейтинг: 0 / 0
11.04.2014, 16:28
    #38612572
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WebService монопольный запуск, контроль выполнения
Почему бы не сделать так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
private static readonly object globalSyncRoot = new object();

public void DoSomething()
{
    lock (globalSyncRoot)
    {
        // Вот тут Сервис обрабатывает данные
    }
}


Или идея в том, что если процесс запущен, то не надо его повторно запускать?

Тогда как-то так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
private static bool done = false;
private static readonly object globalSyncRoot = new object();

public void DoSomething()
{
    if (!done)
    {
        lock (globalSyncRoot)
        {
            if (!done)
            {
                // Вот тут Сервис обрабатывает данные
                done = true;
            }
        }
    }
}
...
Рейтинг: 0 / 0
11.04.2014, 17:11
    #38612641
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WebService монопольный запуск, контроль выполнения
skyANAПочему бы не сделать так:

а кто сказал, что речь идёт про веб-сервисы в контексте одного запущенного приложения?
такой подход:

1. не подходит, если домены разные
2. по сути тоже самое, только в "сахарной" обёртке C#
...
Рейтинг: 0 / 0
11.04.2014, 17:18
    #38612653
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WebService монопольный запуск, контроль выполнения
hVostt, а если разные запросы обрабатываются разными серверами?
...
Рейтинг: 0 / 0
11.04.2014, 17:20
    #38612658
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WebService монопольный запуск, контроль выполнения
Можно и sp_getapplock посоветовать, зная любовь ТС к СУБД.
...
Рейтинг: 0 / 0
11.04.2014, 17:22
    #38612663
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WebService монопольный запуск, контроль выполнения
Ведь кто сказал, что не хранимая процедура обрабатывает данные.
...
Рейтинг: 0 / 0
11.04.2014, 17:44
    #38612699
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WebService монопольный запуск, контроль выполнения
skyANAhVostt, а если разные запросы обрабатываются разными серверами?

ога, осталось только погадать на кофейной гуще, что там задача
...
Рейтинг: 0 / 0
11.04.2014, 17:50
    #38612715
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WebService монопольный запуск, контроль выполнения
Вангую: там кластер из 12 серверов
...
Рейтинг: 0 / 0
12.04.2014, 12:12
    #38613060
Volochkova
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WebService монопольный запуск, контроль выполнения
hVosttVolochkovaМожно подробнее про занятый порт?

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

в целом, лучше использовать механизмы синхронизации (пункт 1), это не сложно:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
            EventWaitHandle globalWaitHandle;
            // проверить, не запущен ли уже кем-то сервис
            if (TryOpenExistingEventWaitHandle("E7D85C00-C2EB-496F-8E8C-BD399E118258", out globalWaitHandle))
            {
                // сервис уже запущен другим приложением
                // ...
            }
            // ок, захватываем глобальный EventWaitHandle по имени (я выбрал сгенерированный GUID)
            globalWaitHandle = new EventWaitHandle(false, EventResetMode.AutoReset, "E7D85C00-C2EB-496F-8E8C-BD399E118258");
            // запускаем свой сервис



Сама проверка сама по себе понятна.
Но если клиент отвалился, а второй пытается подключиться, то мне бы остановить предыдущий запуск.
Или чтобы админ мог подключиться, посмотреть что сейчас обрабатывается и сделать стоп всем запущенным сервисам.
Собственно самое важное, это прервать уже запущенную загрузку.
...
Рейтинг: 0 / 0
12.04.2014, 13:28
    #38613086
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WebService монопольный запуск, контроль выполнения
чето я не догоняю, есть атрибуты поведения сервиса ( стандартные), ими это всем можно настроить без труда ( single)
или это не то что я думаю?
...
Рейтинг: 0 / 0
12.04.2014, 13:39
    #38613092
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WebService монопольный запуск, контроль выполнения
Где-то в степи, дак мы в разделе ASP.NET, а не WCF, если ты про
Код: c#
1.
[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Single)]
...
Рейтинг: 0 / 0
12.04.2014, 13:50
    #38613100
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WebService монопольный запуск, контроль выполнения
skyANA,
Ааа.. понятно...
...
Рейтинг: 0 / 0
12.04.2014, 15:47
    #38613157
Volochkova
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WebService монопольный запуск, контроль выполнения
hVosttVolochkovaМожно подробнее про занятый порт?

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

в целом, лучше использовать механизмы синхронизации (пункт 1), это не сложно:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
            EventWaitHandle globalWaitHandle;
            // проверить, не запущен ли уже кем-то сервис
            if (TryOpenExistingEventWaitHandle("E7D85C00-C2EB-496F-8E8C-BD399E118258", out globalWaitHandle))
            {
                // сервис уже запущен другим приложением
                // ...
            }
            // ок, захватываем глобальный EventWaitHandle по имени (я выбрал сгенерированный GUID)
            globalWaitHandle = new EventWaitHandle(false, EventResetMode.AutoReset, "E7D85C00-C2EB-496F-8E8C-BD399E118258");
            // запускаем свой сервис



Придется делать все таки статик элемент и хранить в нем что то типа Executing.

Вот что нашла, на просторах интернета.
как то вот так
В принципе доступно описана и задача и код.

Единственное что пока не разобрала, как начать загрузку - и не ждать ответа.
Но думаю что "докурю"

Спасибо.
...
Рейтинг: 0 / 0
12.04.2014, 15:51
    #38613160
Volochkova
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WebService монопольный запуск, контроль выполнения
Дошло, запускают поток на сервере.
Вот не уверена что это хорошая практика.
Была мысль запустить поток на клиенте и тут же его придушить :-)
А через статик элементы получать состояние о процессе на клиенте.

Теперь осталось только написать.
Огромное спасибо 2 hVostt.
...
Рейтинг: 0 / 0
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / WebService монопольный запуск, контроль выполнения / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]