Setări client faq

În ciuda faptului că noua caracteristică este suficient de transparentă pentru a utiliza, de multe ori primim întrebări de la utilizatori pentru a oferi scripturi personalizate folosind ea - de ce <это> funcționează și cum să facă <то> Acesta funcționează un pic diferit.







Am observat că există două tipuri de setări - setările aplicației (Application scoped) și preferințele utilizatorului (User scoped). Mai mult decât atât, setările aplicației, pare numai pentru citire, iar eu nu le pot schimba în timpul rulării. De ce?

Există două tipuri de bază de opțiuni care sunt utilizate de aplicații:

  1. Unele date, cum ar fi siruri de conexiune de baze de date sau link-uri de internet care nu se schimba de multe ori, dar, cu toate acestea, ar trebui să fie disponibile pentru editare de către administrator și nu poate fi, prin urmare, „cusute“ în codul de aplicare.
  2. Setările și preferințele utilizatorului, care se pot schimba în orice moment.

Setările Scoped aplicație sunt destinate utilizării în primul scenariu, un utilizator scoped - în al doilea. Aceste considerații sunt, de asemenea, din cauza și SettingsProvider comportamentul implicit - fișierul de configurare aplicație stocată în app.exe.config lângă fișier executabil, și setările de utilizator - în fișierul user.config în dosarul datelor de utilizator. Prin fișiere app.exe.config nu poate exista acces de scriere în timpul rulării, de exemplu, în cazul în care aplicația este instalată în C: \ Program Files \. în cazul în care numai utilizatorii privilegiați au acces la înregistrare. Chiar dacă un astfel de acces este - acest lucru nu este de obicei o idee bună pentru a schimba setările care afectează toți ceilalți utilizatori ai aplicației.

Ai spus că fișierele user.config sunt în dosarul cu datele utilizatorului. Cum pot găsi acest fișier? El este de unu la unu sau mai multe aplicații?

După cum sa menționat deja, implicit SettingsProvider pentru aplicațiile client (LocalFileSettingsProvider) salvează setările aplicației în fișierele de configurare. In .NET 1.0 si 1.1, au existat două nivele de fișiere de configurare - machine.config și app.exe.config (unde „App.exe“ - numele fișierului aplicației). În .NET 2.0, am adăugat încă două niveluri pentru a stoca setări specifice pentru utilizator - în roaming folderul profil de utilizator în dosarul cu profilul utilizatorului local. Pentru XP va fi ceva de genul „C: \ Documents and Settings \\ Application Data 'și' c: \ Documents and Settings \\ Local Settings \ Application“, respectiv. Aceste directoare - recomandate (și pentru Windows Logo - necesar) spațiu de stocare pentru datele de utilizator și de cele mai multe aplicații (cum ar fi Outlook și Visual Studio) a pus datele de utilizator aici.

Calea exactă la user.config fișier va fi ca acest lucru:

  • - Catalog de roaming sau profilul utilizatorului local. Setările implicite sunt stocate în user.config în profilul local. Pentru a stoca setarea din profilul de roaming este necesar să-l marcheze cu atributul SettingsManageability SettingsManageabilityAttribute setat la valoarea Roaming.
  • - de obicei, un șir de caractere specificat în AssemblyCompanyAttribute (eventual scurtat și înlocuirea unora dintre personaje. Dacă nu a folosit niciodată AssemblyCompanyAttribute, a folosit o linie de la un alt atribut.)
  • - de obicei, un șir de caractere specificat în AssemblyProductAttribute (cu aceleași note ca și pentru numele companiei)
  • și - informații despre Evidence (originea) din domeniul de aplicare.
  • - De obicei, aceasta este versiunea specificată în AssemblyVersionAttribute. Folosit pentru funcționarea diferitelor versiuni ale partea de aplicare de către partea.

De fapt, numele fișierului este întotdeauna doar „user.config“.

De ce este acest mod de a user.config zamorochenny?

Un algoritm pentru a construi căi ar trebui să ofere unele cerințe stricte în ceea ce privește protecția, izolare și fiabilitate. Deși am încercat să facă acest drum, în măsura în care este posibil, ușor de perceput, folosind linia definită prietenos de aplicație, nu a fost posibil să-l lase destul de atât de elementar, nu se confruntă cu un conflict cu alte aplicatii, spoofing, etc.

Poate sa schimbat cumva?

LocalFileSettingsProvider nu oferă o metodă de a schimba calea către fișierul de configurare. Vă rugăm să rețineți că furnizorul real, și nu specifică calea către fișierul de configurare în primul caz - este configurația sistemului. Dacă aveți nevoie pentru a stoca setările, din orice motive, într-un alt loc, calea recomandată este de a scrie SettingsProvider ta. Sale destul de ușor să pună în aplicare, exemple pot fi găsite în SDK .NET 2.0. Țineți însă cont de faptul că s-ar putea confrunta cu problemele menționate mai sus de izolare.

Am deschis aplicația mea folosind ClickOnce, și păstrate unele setări, dar nu pot găsi user.config fișier.

Algoritmul pentru întocmirea calea de mai sus nu este utilizat în cazul ClickOnce. În schimb, user.config local de fișiere în directorul cu datele ClickOnce (partea De asemenea, incluse în calea). Roaming user.config dacă ClickOnce aplicației nu se aplică.

Ca proprietatile mele puternic tipizat sunt serializate în configurare? Nu am putut obține <вставьте ваш тип здесь> serializat corect.

Pentru setări de serializare ApplicationSettingsBase pot utiliza două mecanisme principale:

  1. Dacă există TypeConverter, care poate efectua conversia siruri de caractere și un șir de caractere, acesta este utilizat.
  2. În caz contrar, XmlSerializer.






De obicei, funcționează unul dintre aceste mecanisme, dar există tipuri pentru care nu funcționează aceste metode. În acest caz, aveți următoarele opțiuni:

  • Punerea în aplicare pentru TypeConverter dvs. de tip, care se poate transforma dintr-un șir de caractere și un șir de caractere. Implementarea se poate utiliza orice mecanism adecvat pentru serializarea FW, sau pe propriul drum. În continuare, puteți specifica această TypeConverter în proprietățile setările de clasă.
  • Introduceți valoarea cerută de SettingsSerializeAs, folosind SettingsSerializeAsAttribute. De exemplu, dacă doriți să serialize setarea în format binar, specificați SettingsSerializeAs.Binary.

Cererea mea are un obicei câteva (utilizator scoped) setări, dar Visual Studio le pune în app.config. Am crezut că ar trebui să fie user.config fișier?

Sistemul de configurare este ierarhică și are următoarea ordine: mașina (mașina) -> cerere (cerere) -> utilizator al serviciului de roaming (roaming utilizator) -> utilizator local (utilizator local). Când solicitați o secțiune de configurare la orice nivel, veți obține o vedere fuzionată a acestei secțiuni cu acest nivel și toate nivelurile de mai jos (nivelul mașinii - cel mai mic, iar utilizatorul locală - cea mai mare). secțiunea Procesor definește modul în care este o prioritate mai mare decât cea a config aplicare îmbinarea, acordând prioritate, de exemplu, configurația de configurare utilizator local.

Astfel, setările de utilizator, implicit utilizat, s-ar putea fi confundat cu valorile app.config. Când setările sunt salvate în user.config, valori noi înlocuiesc parametrii în mod implicit. Rețineți că valorile implicite pot fi, de asemenea, determinate de DefaultSettingValueAttribute. Furnizorul va folosi aceste valori în cazul în care nu există alte valori nu sunt definite la orice nivel de configurare.

De ce avem nevoie de numărul de versiune în calea către fișierul user.config? Din cauza aceasta în timpul instalării noii versiuni, utilizatorii pierde toate setările stocate versiunea anterioară a aplicației.

Există mai multe motive pentru care calea către user.config Sensibil se face la numărul de versiune:

  1. Pentru a putea implementa side-by-side versiuni multiple ale aceleiași aplicații (de exemplu, dacă utilizați ClickOnce). Diferite versiuni de aplicații pot utiliza diferite setări.
  2. Când modernizarea clasei de setări ale aplicației pot fi modificate și vor fi compatibile cu setările salvate anterior, ceea ce poate duce la probleme.

Cu toate acestea, ne-am oferit posibilitatea de a transfera cu ușurință setările de la o versiune anterioară a cererii. Doar apel ApplicationSettingsBase.Upgrade () și setările versiunii anterioare, care corespund la versiunea curentă a setărilor de clasă vor fi salvate în versiunea curentă user.config. Există, de asemenea, posibilitatea unei suprasarcini acestei funcții în setările de clasă sau în implementarea furnizorului.

OK, deci cum pot determina când pentru a apela upgrade ()?

Bună întrebare. În ClickOnce, atunci când este instalat noua versiune a aplicației, ApplicationSettingsBase detectează și actualizează automat setările. Dacă ClickOnce nu sunt în uz, trebuie să apelați la Upgrade () le. Aceasta este o opțiune, deoarece este posibil să se determine când pentru a apela Upgrade ():

Intră în setările CallUpgrade boolean și setați valoarea implicită la true. Când porniți aplicația face ceva de genul:

O astfel de realizare se asigură că upgrade () este numit doar atunci când prima pornire a noii versiuni.

Există o modalitate de a accesa setările din fișierul de configurare, în cazul în care nu există setări de clasă corespunzătoare?

Aceasta este o caracteristică destul de puternic. Este o gaură de securitate? Oricine poate accesa setările mele fără știrea sau permisiunea mea!

Aceasta nu este o gaură de securitate din două motive:

  1. C în ceea ce privește protecția, izolația este asigurată la nivel de domeniu de aplicare. Recomandat în modul în CLR este de a utiliza un cod care nu prezintă încredere (untrusted) într-un domeniu de aplicație separată. Când creați un domeniu de aplicație, puteți defini un nume prietenos unic și specificați fișierul de configurare cerere pentru ea. Numele unic prietenos asigură faptul că domeniul de aplicație va primi un fișier separat setările de utilizator. Astfel, dintr-un alt domeniu de cod nu va putea accesa setările ca acesta nu are acces la fișierul de configurare. Pe de altă parte, orice cod care are acces la fișierele de configurare se pot aplica la setările, chiar și fără SettingsGroupNameAttribute. de exemplu, prin orice API de nivel scăzut (deși necesită sarcini de citire ConfigurationPermission și un pic mai mare pentru înregistrare).
  2. Dacă sunteți absolut paranoic și nu doresc să dea acces la setările fără a trece prin clasa ta, chiar și pentru codul rulează în același domeniu, puteți cripta setările înainte de a le transfera la ISP-ul dvs. și decripta atunci când lectură. Setările API nu prevede aceste metode speciale, dar puteți utiliza API Crypto a .NET Framework. API-ul de configurare oferă, de asemenea posibilitatea de a cripta secțiuni de configurare - a se vedea acest articol pentru mai multe informații ..

Toate acestea înseamnă că nu pot avea acces la modul de setări cu încredere parțială?

Deloc. activitatea desfășurată de noi asigură că puteți accesa în siguranță setările în modul de încredere parțială. De fapt, va arăta la fel de bine ca și citire și scriere a cererii dumneavoastră. Singura diferență - nu se poate scrie un număr nelimitat de date, din motive evidente. Numărul de octeți pe care le puteți arde prin API Settings (LocalFileSettingsProvider), în conformitate cu încredere limitată administrativă folosind clasa parțială IsolatedStoragePermission. Ie de fapt, precum și pentru stocarea izolată (Storage izolată) în general.

Ați menționat de mai multe ori API-ul de configurare. Ce este și cum diferă de API Setări?

Există o diferență fundamentală între API Setări și API-ul de configurare. Primul oferă un model de obiect pentru gestionarea setărilor aplicației. Acest model folosește o schemă de conservare de către furnizori, astfel încât economisirea efectivă este destul de abstract. În cazul în care sunt stocate setările, problema implementării furnizor - poate să le stoca în prime-fișiere, SQL Server, registru, sau de a provoca un serviciu web la distanță. Furnizorul furnizat de utilizare implicit config-fișiere, deoarece acest lucru este cel mai evident magazia pentru setările aplicațiilor client. Astfel, API-ul Configuration - este de nivel inferior API, care permite actualizarea în secțiunea de configurare config-fișier. În unele moduri Setări API se află pe partea de sus a API-ului de configurare.

Deci, dacă aveți nevoie pentru a lucra cu setările aplicației și preferințele utilizatorului, aveți nevoie de API-ul Setări. Dacă trebuie să pună în aplicare o secțiune de configurare sau consultați secțiunea de configurare direct - utiliza API-ul de configurare.

Setări API este disponibilă numai în aplicațiile Windows Forms?

API-ul de fapt Setări nu are restricții - puteți folosi în toate tipurile de aplicații - klientstkih, pe web, VSTO (Visual Studio Tools pentru dezvoltatori Office), consola, WPF (Windows Presentation Foundation), etc. Furnizorul implicit, LocalFileSettingsProvider. Acesta utilizează config-fișiere pentru a stoca setările, care impune anumite restricții. De exemplu, aplicațiile ASP.NET nu au user.config fișiere, astfel încât să nu puteți salva setările personalizate folosind acest furnizor. Desigur, puteți utiliza Profiluri ASP.NET 2.0 pentru a stoca preferințele utilizatorului. Fișierele User.config nu sunt acceptate pentru VSTO-aplicații (de exemplu, ori de câte ori nucleul este nativ-aplicație, cum ar fi Outlook, Word sau IE). În acest caz, va trebui să scrie propriile setări-furnizor (care, întâmplător, este destul de simplu, și există exemple bune și documentație pe MSDN pe acest subiect) la o citire / scriere setări de utilizator. Pentru principalele tipuri de aplicații client gestionate - consola, Windows Forms si WPF, LocalFileSettingsProvider sprijinit pe deplin.