ПредишенСледващото

ASP.NET MVC --- ASP.NET 5 --- Подобрена производителност с контролери

MVC Framework инфраструктура предлага два специални видове контролери, които могат да подобрят ефективността на разработените уеб приложението MVC. Както и при никакви оптимизации производителност при работа с тези контролери или ще трябва да жертват лекота на използване, или трябва да се справят с ограничена функционалност. В следващите секции ще демонстрират използването на двата вида контролери и дава обяснения, свързани предимства и недостатъци.

Използването на контролери, които не поддържат от състоянието на сесията

По подразбиране, контролери поддържат от състоянието на сесията, която може да се използва за съхраняване на стойности на данни между исканията, опростяване на решения MVC програмисти задачи. Създаването и поддържането държавна сесия - сложен процес. Тези данни трябва да се съхраняват и извличат, а самите сесии - контролирани, за да гарантират правилното политика стареене. данните за сесиите консумират памет на сървъра или някой друг за съхранение, както и необходимостта за синхронизиране на данни между различни уеб сървъри усложнява стартиране на приложения върху множество сървъри (за големи приложения).

За да се опрости сесия състояние подкрепа ASP.NET ще обработва само една заявка за дадена сесия в даден момент. Ако клиентът издава множество застъпване на заявки, сървърът ще ги обработват и последователно се редят на опашки. Предимството на този подход е, че не е нужно да се притеснявате за модификациите на един и същ брой искания за данни по едно и също време. Недостатъкът е свързано с невъзможността за постигане на необходимите искания за интернет трафик.

Не всички контролери изискват сесия състояние съоръжението. В такива случаи работата на приложенията може да се подобри, като се избягва работата, който е свързан с държавата за подпомагане на сесията. Това се постига чрез използването на контролери, които не поддържат държавна сесия. Те са много сходни с конвенционалните контролери, но с две изключения: MVC Framework инфраструктура не се зарежда или да запазите състоянието на сесията, когато тези контролери се използват за обработване на заявката, и припокриващи се искания могат да се обработват едновременно.

Управление на държавната сесия в специална фабрика IControllerFactory

При обсъждането на растителни контролери в предишна статия, ние показахме, че IControllerFactory интерфейс съдържа метод, наречен GetControllerSessionBehavior (). SessionStateBehavior при която се извежда стойност изброяване. Този списък съдържа четири стойности, които контролират държавната сесия конфигурацията на контролера:

Преброяване стойност SessionStateBehavior

Сесия състояние е напълно забранено

Фабрика контролер, който реализира IControllerFactory интерфейс директно определя държавната поведението на сесия за контролери SessionStateBehavior връщане на стойностите от метода GetControllerSessionBehavior (). Този метод отнема като параметри на обекта RequestContext и низ, съдържащ името на контролера. Можете да се върнете и да е от четирите стойности, посочени в таблицата по-горе, както и различни контролери могат да се завръщат различни стойности.

Следващият пример показва модифицирана реализация GetControllerSessionBehavior () метод на клас CustomControllerFactory, която е създадена по-рано:

сесия за държавно управление, използвайки DefaultControllerFactory

В случай на заводски интегрирани контролери управляват сесия състояние контролер може да бъде чрез използването на атрибута SessionState на отделни класове от контролери, както е показано в примера по-долу, където е създаден нов контролер, наречен FastController:

SessionState атрибут се прилага към класа на контролера и оказва въздействие върху всички методи на действие в този контролер. Единственият параметър е приет от този атрибут - стойност изброяване SessionStateBehavior на. В илюстрирания пример, състоянието на сесията е напълно забранено. Това означава, че ако се опитате да зададете стойност на сесия в контролера, например:

или се опитайте да го прочетете в презентацията:

Рамката MVC ще хвърли изключение, когато действието ще се нарича, или една идея изобразена. Когато от състоянието на сесията е забранена, HttpContext.Session имот връща нула.

Използването на асинхронни контролери

основната MVC Framework ASP.NET .NET платформата поддържа резерв от нишки. който се използва за обработка на заявки на клиенти. Този басейн се нарича басейн на нишките на работниците, както и всички потоци - съответно на работния процес. При получаване на работния процес на заявка отстранен от басейна и започва обработка на искането. След обработка на искането на работния процес се връща в басейна, така че тя ще бъде достъпна за обработка на нови искания, тъй като те пристигнат.

Използването на конец басейн в приложение за ASP.NET осигурява две предимства:

Благодарение на работния процес за многократна употреба се избягват режийните, свързани със създаването на нова тема работник, когато е необходимо да се обработи заявката.

До като фиксиран брой възможно разположение на работния процес, за да се избегне ситуация, в която броят на едновременни заявки надхвърля възможностите на сървъра.

Пуул работния процес работи по-добре, когато исканията могат да се обработват в един кратък период от време. Тази ситуация е характерна за повечето от прилагането MVC. Въпреки това, в присъствието на действия, които зависят от други сървъри, и изискват много време, за да завърши, тя може да бъде, че всички теми, работници са заети в очакване на приключване на други системи.

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

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

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

Асинхронни контролери са полезни само за дейности, които са свързани с IO или мрежа, но не и тези, които правят силно натоварване на процесора. Проблемът, който се опитвате да се реши с помощта на асинхронни контролери, свързани с несъответствието между модела на басейн и вида на обработените заявки. Басейн има за цел да гарантира, че всяко искане получава съответния дял от ресурсите на сървъра, но в крайна сметка е набор от работни процеси, които не се справят нищо. Ако използвате допълнителни фонови теми за действие, интензивно работи с централния процесор, ресурсите на сървъра се губят твърде много едновременни входящи заявки.

В този раздел се предполага, че сте запознат с Parallel библиотека задачите (Task Parallel библиотека - TPL). Самата библиотеката е описан в потоци и файлове. Също така можете да видите пример за създаване на асинхронни уеб формуляри на ASP.NET уеб форми.

пример на получаване

Преди да се пристъпи към обяснението на асинхронни контролери, ние ще покажем пример за проблем, за които решения са предназначени. Примерът по-долу показва кода на конвенционален синхронен контролер име RemoteData, който е добавен в примерния проект:

Този контролер съдържа стъпки, наречени метода на данни (), който създава инстанция на RemoteService клас модел и призовава метод го GetRemoteData (). Този метод е пример за стъпки, които може да отнеме значително време, но малко използване на процесора. Следният пример показва класа RemoteService, което е определено в папки RemoteService.cs вътре Модели:

В действителност GetRemoteData () метод се симулира. В действителност, този метод може да се извлече комплексни данни през бавна връзка мрежа, но за простота сме използвали метод Thread.Sleep (), за да се симулира две секунди закъснение. Най-новото допълнение е нова идея. Това създава Прегледи / RemoteData папка, в която представяне файл Data.cshtml със съдържанието, показани в този пример:

След стартиране на приложението и отидете да се образува URL / RemoteData / обаждания за данни най-подходящия метод стъпки RemoteService обект се създава и след това извиква GetRemoteData (метод). След две секунди (симулиращи действителните операции производителност), завръщащи се на данни от GetRemoteData (), които се предоставят на представителството за визуализация:

MVC 5, подобряване на производителността с контролери

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

Създаване на асинхронен контролер

Чрез използването на асинхронни контролер, конци работник се освобождава и може да се справи други искания. Той не пречи на взаимодействието с потребителския интерфейс на приложението за две секунди при чакащите. В крайна сметка, фиктивните данни се приемат и обработват. Има клиентски технологии (AJAX), с които можете да отправят такова искане в браузър, който ви позволява да поне да информира потребителя по време на събиране на данни и да му даде възможност да продължи да работи с другата част на приложението.

След илюстрира проблема, ние ще се вземе решение, нека да преминем към създаването на асинхронния контролера. Такъв контролер могат да бъдат създадени по два начина. Първият от тях - реализирането на интерфейс е в IAsyncController System.Web.Mvc.Async име пространство, което е еквивалентно на асинхронен IController. Този подход няма да бъде показана, защото тя изисква подробно обяснение на понятията паралелно програмиране .NET.

Внимание ще продължи да се фокусира върху рамка MVC, така че следното е пример за втория подход: използването на нови ключови думи очакват и асинхронен в нормално контролера.

В предишните версии на .NET Framework създаването на асинхронни контролери бяха тромави задача и изисква специално Controller наследи от разделянето на класа и всяко действие по два метода. Нови ключови думи очакват и в асинхронен значително опростяват процеса: необходимо е да се създаде нов Task обект и прилагат изчака резултата, както е показано в примера по-долу:

Старият начин за създаване на асинхронни методи за действие все още се поддържа, въпреки че се счита тук подходът е много по-елегантен, така че е препоръчително да го използвате. Един от предметите на стария подход е невъзможността да се използват методите на имена на действия, които завършват в асинхронен (например, IndexAsync ()) или завършени (например, IndexCompleted ()).

Така че, в този пример е проведено метод рефакториране действие, така че сега той се връща на задача. ключови думи, използвани асинхронен и да изчака, както и създадени Задача обект, който е отговорен за разговори GetRemoteData () метод.

Използване на асинхронни методи в контролера

Asynchronous контролер може да се използва за асинхронни методи другаде в заявката. За да се демонстрира клас RemoteService добавя асинхронен метод, както е показано в примера по-долу:

Резултатът GetRemoteDataAsync () метод е обект Задача, който доставя същото послание като синхронен метод, когато бъде завършен. Следният пример може да се види как се използва асинхронен метод в новите етапи на метода, добавени към RemoteData контролер:

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

Подкрепете проекта - споделете линка, благодаря!