De la lansare, aplicațiile și componentele ASP.NET au căutat fișierul web.config pentru a încărca setările de care au nevoie pentru a funcționa. Cu toate acestea, adăugarea de setări personalizate pentru a adăuga flexibilitate și robustețe la o aplicație sau la o componentă nu este la fel de directă pe cât ar dori majoritatea. Acest articol vă învață cum să scrieți clasele necesare pentru a gestiona elementele de configurare XML și să utilizați setările pe care le conțin în codul dvs..
Tutorial publicatLa fiecare câteva săptămâni, revizuim câteva postări preferate ale cititorului nostru de-a lungul istoriei site-ului. Acest tutorial a fost publicat pentru prima oară în noiembrie 2012.
.NET Framework oferă o gamă largă de setări care pot fi configurate în cadrul web.config pentru a modifica comportamentul uneia sau mai multor componente încorporate în cadrul aplicației. Pentru unii dezvoltatori, lipirea doar a setărilor furnizate de .NET Framework este suficientă. Mulți dezvoltatori găsesc însă că trebuie să controleze o colecție mai largă de setări - fie pentru componente (scrise de ei înșiși sau o parte terță), fie pur și simplu un set de valori pe care aceștia le folosesc în întreaga aplicație.
Fișierul web.config vă permite să setați setările personalizate cu
Setările cheie / valoare pot fi utile în multe situații, dar
Din fericire, Microsoft permite dezvoltatorilor să scrie clase care să adauge acces programatic la setările personalizate de configurare conținute în web.config.
Setările din cadrul web.config sunt clasificate în secțiuni de configurare. De exemplu, setările conținute în
secțiunea se referă la setările ASP.NET pentru aplicația dvs. Puteți modifica schema de autentificare a aplicației dvs., precum și puteți adăuga sau elimina dispozitivele de tratare HTTP pentru a efectua anumite funcții pentru anumite tipuri de fișiere.
O secțiune de configurare este necesară pentru toate setările care nu sunt conținute în
Configurația folosită ca exemplu în acest tutorial este pentru o componentă care recuperează feedurile RSS sau Atom. Nu face nici o analiză, deoarece aceasta depășește scopul acestui tutorial. În loc de a codifica greu lista de feed-uri pentru a fi preluate, componenta se uită la configurația sa pentru a conține numele și adresele URL ale feed-urilor pentru a fi preluate. Componenta se numește FeedRetriever, iar structura XML dorită a configurației sale arată astfel:
Aceste
Configurația de mai sus este simplă.
După proiectarea structurii XML, următorul pas este să scrieți un handler de configurare pentru a procesa setările definite în XML. Handlerul este în primul rând o clasă care moștenește din System.Configuration.ConfigurationSection, dar încorporează și utilizarea altor clase - cum ar fi clasele care derivă din System.Configuration.ConfigurationElement și System.Configuration.ConfigurationElementCollection.
Clasele bazate pe ConfigurationElement reprezintă elemente individuale; este blocul de construcție al unei secțiuni de configurație. Tipurile care derivă din ConfigurationElementCollection reprezintă pur și simplu elemente care conțin mai mult de un tip de element. Din configurația listată mai sus,
ElementVeți începe cu
Fiecare obiect ConfigurationElement funcționează ca indexer pentru colecția sa internă de valori ale proprietăților. Este această colecție internă, împreună cu atributele .NET, care vă permite să cartografiați
Următorul cod este codul complet pentru clasa FeedElement:
public class FeedElement: ConfigurationElement [ConfigurationProperty ("nume", IsKey = true, IsRequired = true)] șir public nume get return (string); setați this ["name"] = value; [ConfigurationProperty ("url", IsRequired = true, DefaultValue = "http: // localhost")] [RegexStringValidator (@ https?: // \ S + acest [ "url"]; set this ["url"] = valoare; [ConfigurationProperty ("cache", IsRequired = false, DefaultValue = true)] bool public Cache get return (bool) acest ["cache"]; set this ["cache"] = valoare;
Clasa ConfigurationElement servește ca indexator pentru o colecție de proprietăți de configurare care stau la baza acesteia (de aici notația indexer a acestui [keyValue]). Folosind acest cuvânt cheie și accesând proprietatea de bază cu o cheie de șir, puteți obține și seta valoarea proprietății fără a avea nevoie de un câmp privat pentru a conține acele date. Colecția de proprietăți de bază stochează datele ca tip Object; prin urmare, trebuie să aruncați valoarea ca tip adecvat dacă doriți să faceți ceva cu ea.
Proprietățile care reprezintă atributele XML sunt decorate cu atributele ConfigurationPropertyAttribute. Primul parametru al atributului ConfigurationPropertyAttribute este numele atributului XML găsit în cadrul
Valoarea implicită a "http: // localhost" pentru proprietatea Url nu este o eroare. Sistemul .NET vă acordă, de asemenea, posibilitatea de a decora proprietățile cu atribute validator - cum ar fi RegexStringValidatorAttribute decorarea proprietății Url. Acest validator ia valoarea proprietății Url și îl validează în raport cu expresia regulată furnizată atributului; cu toate acestea, aceasta validează și proprietatea Url înainte de a conține datele din elementul XML. Valoarea implicită a proprietății Url este un șir gol când este creat un obiect FeedElement. Un șir gol nu se validează în raport cu expresia regulată furnizată, astfel încât validatorul aruncă o ArgumentException înainte ca orice date să fie încărcate din fișierul XML.
Există două soluții posibile pentru această problemă. Prima abordare modifică expresia regulată pentru a permite șirurilor goale. A doua abordare atribuie o valoare implicită proprietății. Nu contează în acest caz particular. Chiar și cu o valoare implicită, atributul url este încă un atribut obligatoriu în
Există mai multe atribute validator în spațiul de nume System.Configuration pentru a valida datele atribuite proprietăților și atributele XML pe care le cartografiază. Următoarea listă toate atributele validator din spațiul de nume System.Configuration:
Cu excepția CallbackValidatorAttribute, nu trebuie să creați obiecte validator corespunzătoare care să fie utilizate împreună cu atributele validator. Modul .NET de execuție creează obiectele validator corespunzătoare pentru dvs., iar atributele conțin parametrii necesari pentru configurarea obiectelor validator.
Acest bit mic de cod este tot ceea ce este necesar pentru a reprezenta în mod individual
Reprezentarea XML a
Clasa ConfigurationElementCollection conține mai mulți membri, dar numai două sunt marcate ca abstract. Astfel, cea mai simplă implementare a ConfigurationElementCollection are două metode:
Având în vedere acest lucru, vizualizați codul complet pentru clasa FeedElementCollection de mai jos:
[ConfigurationCollection (typeof (FeedElement)]] Clasa publică FeedElementCollection: ConfigurationElementCollection Protected override ConfigurationElement CreateNewElement () returnă nouă FeedElement (); obiect protejat de suprascriere GetElementKey (element ConfigurationElement) return (element (FeedElement)) .Name;
Un ConfigurationCollectionAttribute decorează această clasă de colectare. Primul parametru al atributului este un obiect Tip - tipul de elemente care conține colecția. În acest caz, este tipul FeedElement. După parametrul de tip sunt câțiva parametri numiți puteți trece la atribut. Acestea sunt enumerate mai jos:
Părăsirea acestor parametri numiți nu le-a validat
Clasa finală, numită FeedRetrieverSection, derivă din ConfigurationSection și reprezintă
public class FeedRetrieverSection: ConfigurationSection [ConfigurationProperty ("feeds", IsDefaultCollection = true)] FeedElementCollection public Feeds get return (FeedElementCollection) acest ["feeds"]; set this ["feeds"] = value;
Este o proprietate, de tip FeedElementCollection și numită Feed, este decorată cu o ConfigurationPropertyAttribute - cartografiază-o
Cu ajutorul instrumentului de configurare completă, puteți adăuga elementele corespunzătoare la web.config.
Următorul pas este adăugarea a copil element la
Următoarele element este ceea ce adăugați la un fișier web.config, sub
Acum, aplicația dvs. este configurată corespunzător pentru a utiliza clasele FeedRetrieverSection, FeedElementCollection și FeedElement pentru a vă acorda acces programatic la setările personalizate conținute în
Spațiul de nume System.Configuration conține o clasă statică numită ConfigurationManager. Dacă utilizați
FeedRetrieverSection config = ConfigurationManager.GetSection ("FeedRetriever") ca FeedRetrieverSection;
Metoda GetSection () returnează o valoare de tip Object, deci trebuie să fie distribuită la orice tip de handler este pentru acea secțiune. Acest cod returnează secțiunea numită feedRetriever și exprimă rezultatul ca FeedRetrieverSection. Odată ce ați obiectul, puteți începe să accesați programele de configurare.
Pentru a vă da o idee despre modul în care setările de configurare pot fi utilizate în componenta sau aplicația dvs., următorul cod este o implementare foarte elementară a componentei FeedRetriever.
public class FeedRetriever static public FeedRetrieverSection _Config = ConfigurationManager.GetSection ("feedRetriever") ca FeedRetrieverSection;
public static void GetFeeds () foreach (FeedElement feedEl în _Config.Feeds) // cere cererea HttpWebRequest = (HttpWebRequest) WebRequest.Create (feedEl.Url); Răspunsul HttpWebResponse = (HttpWebResponse) request.GetResponse (); dacă (response.StatusCode == HttpStatusCode.OK) string feedData = String.Empty; folosind (cititor StreamReader = nou StreamReader (response.GetResponseStream ())) feedData = reader.ReadToEnd (); dacă (feedEl.Cache) // nume de fișier al fișierului cache filename = String.Format ("0 _ 1 .xml", feedEl.Name, DateTime.Now.Ticks); // utilizați fișierul cache (StreamWriter writer = StreamWriter nou (@ "C: \" + nume fișier)) writer.Write (feedData);
Mai întâi, o variabilă statică numită _Config, de tip FeedRetreiverSection, este declarată și atribuită o valoare apelând ConfigurationManager.GetSection (). Efectuarea variabilei statice este o alegere de design. Procedând astfel, toți membrii clasei, fie instanțe, fie statice, vor avea acces la setările de configurare fără a trebui să efectueze mai multe apeluri către GetSection ().
Odată ce ați preluat dispozitivul de tratare a secțiunilor cu GetSection (), aveți acces complet la obiectele create de clasele dvs. de handler. Prima linie a GetFeeds () este pentru fiecare buclă care străbate toate obiectele FeedElement conținute cu obiectul FeedElementCollection returnat de proprietatea Feeds. Acest lucru vă oferă acces direct la acele obiecte FeedElement - făcând ușor accesul la numele fiecărui feed, adresa URL și setările cache-ului.
În timpul fiecărei iterații a buclei, metoda face o cerere folosind proprietatea Url a obiectului FeedElement. În cazul în care cererea are succes, datele din feed sunt preluate și stocate în variabila feedData. Apoi, codul verifică proprietatea Cache a obiectului FeedElement pentru a determina dacă trebuie sau nu să se cacheze feedul. Caching-ul feed-ului implică construirea unui nume de fișier utilizând proprietatea Name a obiectului FeedElement și data și ora curente. Apoi, un obiect StreamWriter creează fișierul și scrie datele acestuia.
După cum puteți vedea, folosirea clasei handlerului secțiunii de configurare este cheia pentru a prelua și a utiliza setările personalizate din rețeaua web.config. Este cu siguranță nevoie de mai mult timp și efort de la dvs., dar cu siguranță vă face aplicația sau componenta mult mai ușor de configurat pentru dvs. și pentru alți dezvoltatori.
Știați că avem o categorie .NET pe CodeCanyon. Dacă sunteți un specialist .NET dev, de ce să nu vindeți scripturile / componentele / controalele ca autor și să câștigați 40-70% din fiecare vânzare?