Затворете, ако няма активни нишки или има активни, след това изчакайте, докато приключи, и затворете

Моят преглед на приложението е

http://img823.imageshack.us/img823/8975/modelq.jpg

Уеб услугата ASP.Net приема заявки от различни приложения за цифрово подписване и верификация чрез клиент. След това уеб услугата ще насочи тези заявки към смарт карта

Когато системната дата се промени, искам да се случи следното.

  1. Нови заявки от клиенти се изчакват

  2. Текущата работа между уеб услугата и смарт картата трябва да приключи

  3. Ако има предишни чакащи заявки, те трябва да бъдат изпълнени.

Причината, поради която трябва да се случат горните неща, е, че трябва да затворя съществуващите сесии между смарткартата и уеб услугата. Това трябва да се случи само когато няма подписване/проверка на файлове. Не мога просто да затворя всички сесии, тъй като това може да повлияе на файл, който се обработва от някоя от нишките. Така че трябва да се уверя, че няма текущи активни нишки между уеб услугата и смарт картата.

Написах част от кода, който дава общия брой активни нишки между уеб услугата и смарткартата.

int vWorkerThreads,vWorkerThreadsMax;
int vPortThreads,vPortThreadsMax;
System::Threading::ThreadPool ^ vThreadPool;
vThreadPool->GetAvailableThreads(vWorkerThreads, vPortThreads);
vThreadPool->GetMaxThreads(vWorkerThreadsMax, vPortThreadsMax);
ActiveThreadCount = vWorkerThreadsMax - vWorkerThreads;

Това означава, че също трябва да накарам клиентските заявки да чакат?

МЕХАНИЗЪМ ЗА ПОЧИСТВАНЕ: Затворете PKCS#11 API с помощта на C_CloseAllSessions и C_Finalize извикване, което ще освободи библиотеката, така че да изчисти всички обекти на сесията. Това трябва да се прави веднъж на ден.

Някакви идеи как мога да изпълня такава задача?

АКТУАЛИЗАЦИЯ:

Можех да бъда много по-ясен в запитването си. Искам да изясня, че целта ми не е да изключа уеб услугата ASP.NET. Целта ми е да нулирам смарткартата. Тъй като имам достъп до смарт картата чрез уеб услугата ASP.NET, имам нужда от механизъм за изпълнение на тази задача за нулиране на смарт картата.

Давам текущия процес по-долу

  1. Клиентът открива промяна на датата в полунощ
  2. Клиентът извиква функцията WebService_Close_SmartCard
  3. Уеб услугата получава заявката WebService_Close_SmartCard и на свой ред извиква PKCS11_Close_SmartCard. Това повикване ще бъде обслужено чрез една от наличните нишки от набора от нишки. PKCS11_Close_SmartCard will затворете всички съществуващи текущи сесии със смарт картата.
  4. На този етап искам да се уверя, че няма нишки с извиквания на функции като PKCS11_DigitalSign_SmartCard/ PKCS11_DigitalVerify_SmartCard, които говорят със смарткарта, тъй като PKCS11_Close_SmartCard внезапно ще прекрати другите текущи сесии.

PS: Аз съм нов в ASP.NET и Multithreading.


person Raj    schedule 18.06.2010    source източник
comment
За какъв вид нишки говорим тук: нишки за заявки на ASP.Net, нишки, които сте създали сами, или допълнителни нишки, които използвате сами, напр. Нишки на ThreadPool?   -  person Tim Lloyd    schedule 18.06.2010
comment
Разбирам, че уеб услугата ASP.NET създава свои собствени нишки автоматично чрез техниката ThreadPool. Това е, което използвам.   -  person Raj    schedule 18.06.2010
comment
Така че вие ​​не създавате изрично нови нишки или използвате ThreadPool нишки директно\индиректно, вие просто получавате извиквания към вашия уеб метод и изпълнявате кода си синхронно?   -  person Tim Lloyd    schedule 18.06.2010
comment
Да, ти си прав. Има клиентски API, който извиква уеб услугата. След това уеб услугата управлява нишките автоматично (създава/разпределя и т.н.) в отговор на изискванията на клиента. Уеб услугата говори със смарт карта, като отваря множество сесии за криптиране/декриптиране.   -  person Raj    schedule 18.06.2010
comment
@Raj BTW ActiveThreadCount не е броят на активните нишки, това е просто броят на работните нишки в ThreadPool. Не е задължително да правят нещо. Това е целият смисъл на ThreadPool, имате набор от нишки за работа, не е задължително всички те да са активни през цялото време. По същия начин имате отбор за отбор за световно първенство - те не са всички на терена по едно и също време и понякога никой от тях изобщо не е на терена, напр. между игрите.   -  person Tim Lloyd    schedule 18.06.2010
comment
@Chibacity Мисля, че например за vWorkerThreadsMax = 200 и vWorkerThreads = 198 това ще ми позволи да открия, че 2 нишки са активни от пула? точно.   -  person Raj    schedule 18.06.2010
comment
@Raj Не, това ви казва, че има налични 198 работни нишки в ThreadPool. Не е задължително да правят нищо, може да бездействат и да чакат работа. Не ви казва нищо полезно в този контекст. Моля, прочетете моята актуализация на отговора, не е нужно да се занимавате директно с нишките на заявките. Това е един от основните аспекти на използването на рамка като ASP.NET. Трябва също така да знаете, че ThreadPool е споделен ресурс за целия процес, той не се използва само за заявки за уеб услуги.   -  person Tim Lloyd    schedule 18.06.2010


Отговори (1)


Въпросът беше актуализиран в голяма степен, така че имайте търпение...

Като се има предвид, че нито една нишка не се създава директно\индиректно от кода на вашия уеб метод:

Quesiton Значи вие не създавате изрично нови нишки или използвате ThreadPool нишки директно\индиректно, вие просто получавате извиквания към вашия уеб метод и изпълнявате кода си синхронно?

Отговор Да, прав сте. Има клиентски API, който извиква уеб услугата. След това уеб услугата управлява нишките автоматично (създава/разпределя и т.н.) в отговор на изискванията на клиента. Уеб услугата говори със смарт карта, като отваря множество сесии за криптиране/декриптиране.

По-полезно е да перифразирате първоначалния въпрос по реда на заявките, а не на нишките, напр.

Когато системната дата се промени, искам да рестартирам своето ASP.NET приложение и да се уверя, че всички заявки, които се изпълняват в момента, са изпълнени и че всички неизпълнени\заявки на опашка са завършен също.

Това се обработва автоматично, тъй като има концепция за опашка от заявки и активни заявки. Когато вашето ASP.NET приложение се рестартира, всички текущи и поставени на опашка заявки се изпълняват (освен ако не завършат своевременно), а новите заявки се поставят на опашка и след това се обслужват, когато се възстанови нов работен процес. Този процес се следва, когато рециклирате набора от приложения, към който принадлежи вашето ASP.NET приложение.

Можете да конфигурирате вашия набор от приложения за рециклиране в зададен момент в IIS Manager чрез настройките за рециклиране за свързания набор от приложения. Предполага се, че искате да направите това в 00:00 часа.

Актуализация

Мисля, че мога да разбера от вашите коментари, че трябва да стартирате код за почистване, когато всички заявки са обслужени и след това приложението е на път да се изключи. Трябва да поставите този код в глобалния манипулатор на събития Application_End.

Актуализация 2

В отговор на вашия актуализиран въпрос. Вашите изисквания са:

Когато приложението се рестартира:

  1. Нови заявки от клиенти се изчакват
  2. Текущата работа между уеб услугата и смарт картата трябва да приключи
  3. Ако има предишни чакащи заявки, те трябва да бъдат изпълнени.

Това се подкрепя от стандартния модел за рециклиране, който описах. Не е необходимо сами да се занимавате с нишки на заявки - това е един от стълбовете на ASP.NET framework, той се справя с това вместо вас. Той е ориентиран към заявките и абстрахира как се обработват заявките, т.е. обслужва се в множество нишки. Той управлява поставянето на заявки в нишки и управлява жизнения цикъл на тези заявки, когато приложението се рециклира.

Актуализация 3

Добре, мисля, че имаме последната част от сценария тук. Опитвате се да изключите ASP.NET от вашия клиент, като изпратите извикване на ЗАТВОРЕНА уеб услуга. По принцип искате да приложите свое собствено поведение при изключване на ASP.NET, като се уверите, че всички текущи и поставени на опашка заявки са обработени, преди да изпълните своя код за почистване.

Опитвате се да изобретите отново колелото.

ASP.NET вече има това поведение и се поддържа от:

а. Рециклиране на приложения Той ще обслужва чисто неуредените заявки и ще стартира нов процес за обслужване на нови заявки. Той дори ще постави на опашка всички нови заявки, които са получени, докато този процес продължава.

b. Application_End Глобален манипулатор на събития на приложение, където можете да поставите кода си за почистване. Той ще се изпълни след след като рециклирането се справи точно с вашите неуредени заявки.

Нямате нужда от вашата команда CLOSED.

Трябва да помислите дали да позволите на IIS да рециклира вашето приложение, тъй като има поддръжка за рециклиране в определено дневно време(а). Ако не можете да конфигурирате IIS поради причини за разполагане, тогава можете да използвате web.config, докосвайки, за да принудите рециклиране извън границите на IIS:

а. Имайте таймер, работещ в сървъра, който може да проверява за условието за промяна на датата и след това да докосне файла web.config.

b. Все още клиентът трябва да извика уеб метод CLOSED, но методът CLOSED просто докоснете файла web.config.

IIS, тогава a са най-желаните.

Честно казано Microsoft вече са мислили за това. :)

Актуализация 4

@Raj Добре, нека опитам да перифразирам това отново.

Вашите условия са:

  1. Имате изискване да нулирате вашата смарт карта веднъж на ден.
  2. Преди да нулирате вашата смарт карта, всички текущи заявки и заявки за уеб услуги, поставени на опашка, трябва да бъдат завършени, т.е. неизпълнените заявки.
  3. След като неуредените заявки бъдат изпълнени, нулирате вашата смарт карта.
  4. Всички нови заявки, които идват, докато се случва този процес, трябва да бъдат поставени на опашка и след това да бъдат обслужвани, след като смарт картата бъде нулирана.

Тези условия ви позволяват да завършите съществуващи заявки, да поставите на опашка всички нови заявки, да нулирате вашата смарт карта и след това да започнете да обработвате нови заявки, след като картата бъде нулирана.

Това, което предлагам е:

  1. Поставете кода за нулиране на вашата смарт карта в Application_End.
  2. Конфигурирайте IIS да рециклира вашето приложение в 00:00. Уверете се, че в разширените настройки за свързания набор от приложения сте конфигурирали Disable Overlapped Recycle = True.
  3. В 00:00 рециклирането на приложенията гарантира, че всички текущи заявки и заявки на опашка ще бъдат изпълнени.
  4. След 00:00 рециклирането на приложението гарантира, че всички нови заявки ще бъдат поставени на опашка, докато заявките в 3 са завършени и приложението изпълнява стъпки за изключване.
  5. След като заявките в 3 бъдат изпълнени, Applicaton_End ще бъде извикан автоматично. Това гарантира, че вашата смарт карта се нулира, след като всички текущи заявки бъдат изпълнени.
  6. Рециклирането на приложения гарантира, че вашето приложение се стартира отново в нов процес и че новите заявки, поставени на опашка в стъпка 4, започват да се обработват. Важното тук е, че вашият код за нулиране е бил извикан в 5.

Освен ако във вашия въпрос липсва някаква подробност, горното изглежда отговаря на вашите условия. Искате да направите x,y,z и ASP.NET има вградена поддръжка, която може да се използва за постигане на x,y,z и ви дава зрели, гарантирани и добре документирани реализации.

Все още се мъча да разбера защо говорите за теми. Правя многонишкова разработка, но говоренето за нишки вместо заявки, когато мислим за ASP.NET, добавя ненужна сложност към тази дискусия. Освен ако въпросът ви все още не е ясен.

Може би пропускате идеята, която подчертавам тук. Правя паралел между поведението, което изисквате, когато извикате CLOSED от вашето клиентско приложение, и това, което се случва, когато рециклирате приложение. Можете да използвате recycling и Application_End, за да постигнете необходимите резултати.

Опитвам се да ви помогна тук, тъй като опитът да приложите това поведение сам е ненужен и нетривиален.

person Tim Lloyd    schedule 18.06.2010
comment
Можете ли да обясните какво имате предвид под пряко/косвено? ››Като се има предвид, че нишки не се създават директно\индиректно. В моя случай, когато всеки път клиентът задейства функция за инициализация, вярвам, че се създава нова нишка, ако няма налични текущи нишки. От гледна точка на префразирането на процеса, не само искам да изчистя текущия процес, но също така искам да не разреша входящите заявки. Трябва да заключа текущия процес на почистване. System::Threading::BeginCriticalRegion ще помогне ли? - person Raj; 18.06.2010
comment
@Raj Ако под клиента задейства функция за инициализация имате предвид, че клиентът прави извикване на уеб услуга, тогава това, което се случва тук, е, че се създава нова заявка и да, която ще бъде изпълнена в нишка на заявка. Механизмът за рециклиране, който описах, ще гарантира, че текущите и поставените на опашка заявки са изпълнени, когато рециклирате. Всички нови заявки ще бъдат поставени на опашка, докато рециклирането приключи. Ако вашият клиент прави последователност при извиквания на инициализация\уеб услуги, не виждам никакво наистина сложно поведение тук. - person Tim Lloyd; 18.06.2010
comment
@Raj Бихте ли обяснили по-подробно какъв е вашият процес на почистване - може би редактирайте въпроса си с описание и някакъв код. Мисля, че може би въпросът ви е твърде абстрактен и пропускам нещо. - person Tim Lloyd; 18.06.2010
comment
@Raj Добро описание на комуникациите клиент\сървър и жизнения цикъл на почистване би било полезно. - person Tim Lloyd; 18.06.2010
comment
@chibacity. Добавих още подробности. Благодаря. Правя почистването от гледна точка на смарт картата, а не от почистването на уеб услугата. Уеб услугата за мен е само средата, която говори с моята смарт карта. - person Raj; 18.06.2010
comment
@Raj Супер актуализация на въпроса. Един въпрос, дали всяко повикване на уеб услуга е единица работа, която е независима от всички други повиквания от клиент, или има зависимости между повикванията? Състоянието на уеб методите ли е? - person Tim Lloyd; 18.06.2010
comment
@Raj Актуализирах отговора си. Мисля, че основното нещо тук е, че времето за изпълнение на ASP.NET абстрахира концепцията за управление на нишки със заявки. Вие не се занимавате сами с нишките на заявките, това е нещо, което Рамката е предназначена да прави вместо вас. - person Tim Lloyd; 18.06.2010
comment
@Chibacity Разбирам концепцията за рециклиране. В моя случай, по време на почистване, т.е. когато клиентът открие промяна на датата, той хвърля повикване, наречено близо до уеб услугата. Това повикване трябва да се обработи само след като бъдат обработени всички текущи заявки. Ако това не е така, то ще прекрати вече протичащия процес, да речем подписване/проверка.; Това е аспектът, за който вярвам, че няма да ми позволи да използвам повторния цикъл. Така че ДА, това обаждане CLOSE зависи от други обаждания като Sign/Verify. Не разбирам какво имаш предвид под състояние? Благодаря - person Raj; 18.06.2010
comment
@Raj Пропускате много важен момент, който подробно описах в отговора си. Получавате IIS да управлява рециклирането вместо вас в определеното време. Всичко е там за вас и е изпечено. Не е нужно да се опитвате да вършите тази работа сами. Те вече са мислили за това. - person Tim Lloyd; 18.06.2010
comment
@Raj Полагането на отговорността на клиента да се справи с жизнения цикъл на сървъра не изглежда добро разделение на отговорностите. Сървърът трябва да носи отговорност за себе си чрез IIS. Ако това не е възможно напр. не можете да конфигурирате IIS във вашия сценарий на внедряване, тогава можете или да накарате сървъра да изпълни таймер и да провери за промяна на датата, или все още можете да направите това от клиента. Във всеки случай, ако докоснете файла web.config като част от вашето CLOSED повикване или на сървърен таймер, това ще накара приложението да се рециклира и ще получите пълно изключване. - person Tim Lloyd; 18.06.2010
comment
@Chibacity Много благодаря за участието в това запитване. Прегледах много информация, посочена от вас по отношение на рециклирането. Всъщност актуализирах запитването си с още информация. Целта ми е да нулирам смарт картата, а не уеб услугата. Тъй като имам достъп до смарткартата чрез уеб услуга, имам нужда от механизъм за това. Мисля, че рециклирането помага да се поддържа здравето на нишките, без да се засяга протичащият процес. Но в моя случай една нишка (PKCS11_Close_SmartCard) всъщност ще изключи смарт картата. Ако тази нишка влезе преди другите нишки да са готови. - person Raj; 18.06.2010
comment
@Raj Опитвах се да направя паралел между това, което искате да постигнете, и това, което се случва, когато ASP.NET приложение се изключи като част от рециклирането - има модел. Актуализирах отговора си и се опитах да изпиша нещата по-ясно. - person Tim Lloyd; 19.06.2010
comment
@chibacity Сега разбирам концепцията. Искрено ви благодаря за отделеното време и усилия. - person Raj; 20.06.2010
comment
@chibacity не намирам разширена настройка в IIS6.0, където мога да задам тази стойност, Disable Overlapped Recycle = True. Мога да намеря това свойство с помощта на изследовател на метабази и използвайки cmd линия CScipt.Exe adsutil.vbs SET w3svc/AppPools/DisallowOverlappingRotation 1; Но този cmd ред ми позволява да го направя за всички пулове приложения, а не само за моя пул. Можете ли да ме насочите как мога да намеря това Disable Overlapped Recycle = True в Advanced setting? Благодаря - person Raj; 23.07.2010
comment
@Raj Тази връзка показва как да деактивирате OverlappedRecylce за определен набор от приложения: serverfault.com/questions/84620/ - person Tim Lloyd; 26.07.2010
comment
@Chibacity Благодаря за връзката. Ако погледнете разговорите във връзката, това показва, че скриптовете не работят за отделни групи приложения. - person Raj; 30.07.2010
comment
@Raj Е, това е неприет отговор всъщност там, където го четете. Предполагам, че сте го пробвали и не работи. Направете прилично нещо, гласувайте за него и добавете коментар me old china. :) Има ли някаква реална причина, поради която не можете просто да изключите това за всички групи приложения? Използвам II7, така че не мога да разгледам това по-нататък. Може би бихте могли да зададете нов въпрос за ServerFault, да посочите обратно стария отговор и да кажете, че не работи. Наздраве, Т. - person Tim Lloyd; 30.07.2010