powered by simpleCommunicator - 2.0.46     © 2025 Programmizd 02
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / Удаление экземпляра WCF сервиса в режиме PerCall
6 сообщений из 6, страница 1 из 1
Удаление экземпляра WCF сервиса в режиме PerCall
    #38404512
Jovanny
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем добрый день.

Есть WCF сервис с поведением InstanceContextMode = InstanceContextMode.Percall,
причём методы сервиса часто выполняются достаточно долго по объективным причинам.
Иногда нужно остановить какой-то экземпляр сервиса.
Есть ли возможность идентификации и удаления отдельных экземпляров сервиса?
...
Рейтинг: 0 / 0
Удаление экземпляра WCF сервиса в режиме PerCall
    #38405785
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JovannyВсем добрый день.

Есть WCF сервис с поведением InstanceContextMode = InstanceContextMode.Percall,
причём методы сервиса часто выполняются достаточно долго по объективным причинам.
Иногда нужно остановить какой-то экземпляр сервиса.
Есть ли возможность идентификации и удаления отдельных экземпляров сервиса?
с клиента? или обзервер, который будет их убивать?
...
Рейтинг: 0 / 0
Удаление экземпляра WCF сервиса в режиме PerCall
    #38406756
Фотография EDUARD SAPOTSKI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вариантов решения этой задачи много, но имхо самый надежный - через БД. Создаете таблицу примерно с такой структурой:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
CREATE TABLE [dbo].[WorkFlowsControl](
	[Id] [int] IDENTITY(1,1) NOT NULL,
	[FlowId] [uniqueidentifier] NOT NULL, -- GUID сервиса
	[StartDate] [datetime] NOT NULL, -- Когда сервис стартовал
	[FinishDate] [datetime] NULL, -- Когда завершил работу
	[LastResponse] [datetime] NULL, -- Когда подавал последние признаки жизни
	[FlowState] [int] NOT NULL, -- Состояние сервиса. Например: 0 - работает, 1 - завершил работу, 2 - умер, 3 - убит юзером...
	[KillFlow] [bit] NOT NULL, -- флаг того что нужно убить сервис
 CONSTRAINT [PK_WorkFlowsControl] PRIMARY KEY CLUSTERED 
(
	[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

ALTER TABLE [dbo].[WorkFlowsControl] 
ADD  CONSTRAINT [DF_WorkFlowsControl_StartDate]  DEFAULT (getdate()) FOR [StartDate]
GO

ALTER TABLE [dbo].[WorkFlowsControl] 
ADD  CONSTRAINT [DF_WorkFlowsControl_State]  DEFAULT ((0)) FOR [FlowState]
GO

ALTER TABLE [dbo].[WorkFlowsControl] 
ADD  CONSTRAINT [DF_WorkFlowsControl_KillService]  DEFAULT ((0)) FOR [KillFlow]
GO



Когда сервис стартовал, генерите в нем гуид и инсертите запись в таблицу. Время от времени(например по таймеру)
сервис мониторит таблицу, делает в ней записи о своем состоянии и считывает поле - KillFlow, если true - сам себя убивает.
С какого-то клиента мониторите эту таблицу и видите что у Вас происходит. Если нужно убить сервис ставите KillFlow в true.
Можно обойтись и без БД, например создать еще один сервис с колекцией объектов аналогичной структуры как в приведенной таблице,
и повесить этот сервис как сингл, другие сервисы будут обращаться к этому синглу и делать аналогичные операци. Но здесь есть
одна проблема, синглы имеют неприятную особенность временами падать, особенно если система висит на общественном хостинге, например
рестартонул IIS, в этом случае хрен знает в каком состоянии все умерло.
Вообще если у Вас длительные процессы, то рекомендую посмотреть в сторону Work Flow + WCF, там вышеприведенные механизмы(сохранение состояния в БД)
уже реализованы по дефолту.
...
Рейтинг: 0 / 0
Удаление экземпляра WCF сервиса в режиме PerCall
    #38407067
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EDUARD SAPOTSKIВариантов решения этой задачи много, но имхо самый надежный - через БД. Создаете таблицу примерно с такой структурой:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
CREATE TABLE [dbo].[WorkFlowsControl](
	[Id] [int] IDENTITY(1,1) NOT NULL,
	[FlowId] [uniqueidentifier] NOT NULL, -- GUID сервиса
	[StartDate] [datetime] NOT NULL, -- Когда сервис стартовал
	[FinishDate] [datetime] NULL, -- Когда завершил работу
	[LastResponse] [datetime] NULL, -- Когда подавал последние признаки жизни
	[FlowState] [int] NOT NULL, -- Состояние сервиса. Например: 0 - работает, 1 - завершил работу, 2 - умер, 3 - убит юзером...
	[KillFlow] [bit] NOT NULL, -- флаг того что нужно убить сервис
 CONSTRAINT [PK_WorkFlowsControl] PRIMARY KEY CLUSTERED 
(
	[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

ALTER TABLE [dbo].[WorkFlowsControl] 
ADD  CONSTRAINT [DF_WorkFlowsControl_StartDate]  DEFAULT (getdate()) FOR [StartDate]
GO

ALTER TABLE [dbo].[WorkFlowsControl] 
ADD  CONSTRAINT [DF_WorkFlowsControl_State]  DEFAULT ((0)) FOR [FlowState]
GO

ALTER TABLE [dbo].[WorkFlowsControl] 
ADD  CONSTRAINT [DF_WorkFlowsControl_KillService]  DEFAULT ((0)) FOR [KillFlow]
GO



Когда сервис стартовал, генерите в нем гуид и инсертите запись в таблицу. Время от времени(например по таймеру)
сервис мониторит таблицу, делает в ней записи о своем состоянии и считывает поле - KillFlow, если true - сам себя убивает.
С какого-то клиента мониторите эту таблицу и видите что у Вас происходит. Если нужно убить сервис ставите KillFlow в true.
Можно обойтись и без БД, например создать еще один сервис с колекцией объектов аналогичной структуры как в приведенной таблице,
и повесить этот сервис как сингл, другие сервисы будут обращаться к этому синглу и делать аналогичные операци. Но здесь есть
одна проблема, синглы имеют неприятную особенность временами падать, особенно если система висит на общественном хостинге, например
рестартонул IIS, в этом случае хрен знает в каком состоянии все умерло.
Вообще если у Вас длительные процессы, то рекомендую посмотреть в сторону Work Flow + WCF, там вышеприведенные механизмы(сохранение состояния в БД)
уже реализованы по дефолту.
как сервис себя убьет? В логику некий флаг вставлять do while ( ) ?
...
Рейтинг: 0 / 0
Удаление экземпляра WCF сервиса в режиме PerCall
    #38407085
Фотография EDUARD SAPOTSKI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netivanкак сервис себя убьет? В логику некий флаг вставлять do while ( ) ?
Ну я хз как у ТС сервис реализован и что он делает, но в общем случае нужно выполнение метода завершить через return, как это сделать это уже дело конкретной реализации.
...
Рейтинг: 0 / 0
Удаление экземпляра WCF сервиса в режиме PerCall
    #38429720
Jovanny
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EDUARD SAPOTSKI,

Извините за долгое молчание, отвлекли на другие задачи.
Спасибо, то, что нужно.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / Удаление экземпляра WCF сервиса в режиме PerCall
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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