У меня есть определенный asmx WebMethod, который я хочу ограничить одним запущенным экземпляром за раз.Только один экземпляр. NET Web Service
Причина в том, что он считывает данные из базы данных, считывает данные из файла, обрабатывает данные, отправляет электронные письма и затем сохраняет данные обратно в базу данных, и я обеспокоен тем, что если два экземпляра запускаются за один раз, может вызвать проблемы.
Есть ли способ обеспечить соблюдение этого?
[WebMethod]
public List<string> MyMethod()
{
using (myEntities context = new myEntities())
{
//read database, files and do other stuff here
context.SaveChanges();
}
}
Или, может быть, я могу заставить блокировку базы данных так, чтобы только один поток мог находиться внутри оператора using?
Текущее решение:
[WebMethod]
public List<string> MyMethod()
{
List<string> log = new List<string>();
if(!Monitor.TryEnter(_syncRoot)) {
log.Add("Proccess Currently Running");
return log;
}
try
{
using (myEntities context = new myEntities())
{
//doStuff
context.SaveChanges();
}
log.Add("Success");
}catch (Exception ex) {
log.Add(ex.Message);
} finally {
Monitor.Exit(_syncRoot);
}
return log;
}
Примечание:
Мое текущее решение представляется недостаточным для случая, когда у меня есть несколько серверов, которые я делаю. Может быть, получить таблицу блокировки на столе, и если я не могу получить блокировку, выбросьте исключение. Я могу сделать это?
ASMX является левым а также не должны использоваться для новой разработки. WCF следует использовать для всех новых разработок клиентов и серверов веб-сервисов.Один из намеков: Microsoft отстранила [ASMX Forum] (http://social.msdn.microsoft.com/Forums/en-US/asmxandxml/threads) в MSDN. Среди других причин использования WCF он имеет возможность быть одним экземпляром. –
Да, я знаю об этом. Вы или кто-то еще позволяет мне знать об этом почти каждый раз, когда я отправляю вопрос об asmx. – kralco626
Я или кто-то еще позволяет _all reader_ знать это каждый раз, когда вы публикуете вопрос об asmx. Это не все о _you_. –