powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / Объект уровня приложения для WCF (конкурентный доступ)
9 сообщений из 9, страница 1 из 1
Объект уровня приложения для WCF (конкурентный доступ)
    #35670231
Alex_BBB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тема является продолжением Как организовать очередь.

Суть проблемы:
Есть действия выполнять которые в каждый момент времени может только один поток, и пока эти действия не будут выполнены прерывать работу потока нельзя.

WCF сервис предоставляет доступ к нескольким методам которые выполняют эти действия. Т.е. если несколько клиентов одновременно вызовут эти методы возникнет проблема конкурентного доступа.


Для решения проблемы конкурентного доступа:
Создал класс брокер:
Код: plaintext
public class StampBroker\n{\n    public StampBroker()\n    { }\n\n    public Stamp MakeStamp(...)\n    {\n        Stamp newStamp = null; \n\n        // Ограничим доступ к операциям пока поток не завершит свою работу\n        lock (this)\n        {\n            // 1. достаю значение из БД\n            // 2. произвожу модификации над этим значением\n            // 3. записываю значение обратно в БД\n            newStamp = new Stamp(...);\n        }\n\n        return newStamp;\n    }\n}

Добавил к проекту файл Global.asax:
Код: plaintext
\n//\n// Global.asax.cs\n//\npublic class Global : System.Web.HttpApplication\n{\n\n    protected void Application_Start(object sender, EventArgs e)\n    {\n        // Создадим объект уровня приложения\n        Application["broker"] = new StampBroker();\n    }\n    \n    ...

В методе WCF сервиса пытаюсь достать объект брокер
Код: plaintext
\n//\n// Service.svc.cs\n//\n...\nStampBroker broker = (StampBroker)System.Net.Mime.MediaTypeNames.Application["broker"];\nStamp newStamp = broker.MakeStamp(...);\n...

Достать объект уровня приложения не получается - ошибка компиляции:
\'System.Net.Mime.MediaTypeNames.Application\' is a \'type\', which is not valid in the given context

Вопрос:
Как создать объект уровня приложения для WCF (работает на IIS)?
Спасибо.
...
Рейтинг: 0 / 0
Объект уровня приложения для WCF (конкурентный доступ)
    #35670252
Alex_BBB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если просто сделаю StampBroker статическим - а всякие Global.asax вообще уберу?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
static public class StampBroker
{
    public StampBroker()
    { }

    static public Stamp MakeStamp(...)
    {
        Stamp newStamp = null; 

        // Ограничим доступ к операциям пока поток не завершит свою работу
        lock (typeof(StampBroker))
        {
            // 1. достаю значение из БД
            // 2. произвожу модификации над этим значением
            // 3. записываю значение обратно в БД
            newStamp = new Stamp(...);
        }

        return newStamp;
    }
}
Нормально будет?? По идее каждый раз когда будет вызываться статический метод MakeStamp - будет задействован один и тот же объект - т.е. получится как бы аналог объекта уровня приложения. Так?
...
Рейтинг: 0 / 0
Объект уровня приложения для WCF (конкурентный доступ)
    #35670264
Gatman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Application в веб приложении - это ссылка на обьект HttpApplication, который создаётся автоматом в IIS для всех веб приложений. но он будет уникальным для каждого веб приложения, поэтому передать через него не получится
Для решения Вашей проблемы не нужен ни Application, ни брокер.
Читайте про ServiceBehavior: InstanceContextMode и ConcurrencyMode
Скорее всего для нормальной произовдительности Вам нужно будет вынести те методы, которые могут работать только в одном потоке в отдельный сервис, и в нём выставить InstanceContextMode.Single и ConcurrencyMode.Single
Поэкспериментируйте, может Вас устроят и другие настройки этих параметров, чтобы можно было оставить всё в одном сервисе с удовлетворительной производительностью
Ещё про SessionMode почитайте
...
Рейтинг: 0 / 0
Объект уровня приложения для WCF (конкурентный доступ)
    #35670279
Alex_BBB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gatman, спасибо, буду читать.
И все же если я сделаю StampBroker статическим (как написал постом выше), будет работать так как я ожидаю?
...
Рейтинг: 0 / 0
Объект уровня приложения для WCF (конкурентный доступ)
    #35670290
Gatman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_BBBGatman, спасибо, буду читать.
И все же если я сделаю StampBroker статическим (как написал постом выше), будет работать так как я ожидаю?
1. Блокировка по типу - одна из худших блокирововок. У Вас будет хороший шанс получить deadlock (недавно, кстати, обсуждали блокировки)
2. Даже если Вы сделаете нормальную блокировку (например, через приватное статическое поле), на IIS всё равно будет периодически падать (при интенсивной работе приложения), есть ньюансы работы IIS (точно не помню, поэтому не привожу какие, дабы не написать чушь. если что, читайте у шпушты или эспозито в разделах про внутреннее устройство IIS, или у байера)
3. В данном случае блокировку если делать, nо только на WCF
...
Рейтинг: 0 / 0
Объект уровня приложения для WCF (конкурентный доступ)
    #35670291
Gatman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gatman то только на WCF
...
Рейтинг: 0 / 0
Объект уровня приложения для WCF (конкурентный доступ)
    #35670317
Alex_BBB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gatman
1. Блокировка по типу - хороший шанс получить deadlock (недавно, кстати, обсуждали блокировки)

Под deadlock понимается это?
deadlock -- риск взаимных блокировок — если одна
операция в потоке A заблокирует переменную M1, пытаясь обратиться к пере-
менной M2, а другая параллельно выполняемая операция в потоке B заблокиру-
ет переменную M2, пытаясь обратиться к M1, возникнет взаимная блокировка.

Я думаю мне это не грозит - только одна блокировка в одном месте.

Gatman
3. В данном случае блокировку если делать, nо только на WCF
Имеется ввиду "вынести те методы, которые могут работать только в одном потоке в отдельный сервис и в нём выставить InstanceContextMode.Single и ConcurrencyMode.Single" или
сделать блокировку в самом методе WCF:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
public class Service : IService
{
    private Stamp _MakeStamp(...)
    {
        lock (this)
        {
            ...
        }
        ...
    }
    ...
}
? (уж больно не хочется вторую службу делать для одного метода, что бы вызывать его из основной службы..)

Верно ли, что
"Режим ConcurrencyMode.Single используется в WCF по умолчанию" ( цитата отсюда ) ?
У меня контракт службы никаким такими атрибутами не помечен
Код: plaintext
1.
2.
[ServiceContract]
public interface IService
{
и сам класс службы тоже...
...
Рейтинг: 0 / 0
Объект уровня приложения для WCF (конкурентный доступ)
    #35670336
Gatman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_BBBЯ думаю мне это не грозит - только одна блокировка в одном месте.ну, если не боитесь хакерских атак...
Alex_BBBGatman3. В данном случае блокировку если делать, nо только на WCFИмеется ввиду "вынести те методы, которые могут работать только в одном потоке в отдельный сервис и в нём выставить InstanceContextMode.Single и ConcurrencyMode.Single" или
сделать блокировку в самом методе WCFэто я написал как альтернативу аттрибутам, т.е. имел ввиду lock внутри метода сервисаAlex_BBB
Верно ли, что
"Режим ConcurrencyMode.Single используется в WCF по умолчанию" да

Если только один такой метод (или 2-3, т.е. немного), и не хочется выносить в отдельную службу. может стоит попробовать транзакции в OperationBahavior
...
Рейтинг: 0 / 0
Объект уровня приложения для WCF (конкурентный доступ)
    #35670940
Alex_BBB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gatman, спасибо.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / Объект уровня приложения для WCF (конкурентный доступ)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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