„Webportálok fejlesztése - MCP vizsgafelkészítő tanfolyamok” változatai közötti eltérés

A VIK Wikiből
Új oldal, tartalma: „{{GlobalTemplate|Valaszthato|MCP70-528}} '''70-528 .NET Framework 2.0 Web-Based Client Development''' * Időpont: 2007.04.23-27, 16:00-19:30 * Előadó: * Tankönyv: …”
 
David14 (vitalap | szerkesztései)
 
(Nincs különbség)

A lap jelenlegi, 2013. február 6., 11:54-kori változata

Ez az oldal a korábbi SCH wikiről lett áthozva.

Ha úgy érzed, hogy bármilyen formázási vagy tartalmi probléma van vele, akkor, kérlek, javíts rajta egy rövid szerkesztéssel!

Ha nem tudod, hogyan indulj el, olvasd el a migrálási útmutatót.


70-528 .NET Framework 2.0 Web-Based Client Development

  • Időpont: 2007.04.23-27, 16:00-19:30
  • Előadó:
  • Tankönyv: 70-528 .NET Framework 2.0 Web-Based Client Development - Training Kit


!! Jegyzet

Introducing the ASP.NET 2.0 Web Site

Webes kérések résztvevői

MIME types

  • text/html, text/xml
  • image/jpeg, image/gif
  • audio/basic
  • video/mpeg
  • application/octet-stream

Szerver és böngésző közötti kommunikáció

  • HTTP (80-as port) vagy HTTPS (443-as port) protokollon
  • Request: browser → szerver irányba, GET vagy POST, az utóbbit gyakran PostBack-nek hívják.

IsPostBack-kel lehet lekérdezni, hogy történt-e PostBack.

  • Response: szerver → böngésző irányba
  • Hibakeresés: telnet vagy packet sniffer programmal

Új website létrehozása

Web site típusok:

  • File: helyi filerendszerben
  • FTP: FTP protokollt támogató távoli webszerveren. Aktív (default) és passzív módot is támogat.
  • Local HTTP: helyi IIS szerveren
  • Remote HTTP: Front Page Server Extensions-t támogató távolt webszerveren

Oldal felépítése

  • Oldal direktívák, pl. <%@ Page Language="C#" %>
  • Layout: .aspx-ben
  • Kód: .aspx-ben <script runat="server">-ben vagy .aspx.cs-ben. A nyelv oldalanként változhat.
    • Code-Behind: a megjelenítést és a kódot különválasztjuk
    • Inline: egy file-ba kerül mindkettő
  • Dinamikus fordítás: az oldalak csak az első lekéréskor fordítódnak le

ASP.NET speciális könyvtárak

  • App_Browsers: böngészők azonosítását segítő file-ok, .browser
  • App_Code: BL
  • App_Data: adatbázis, .xml adatfile-ok
  • App_GlobalResources: egész site-ra vonatkozó erőforrások, .resx, .resources
  • App_LocalResources: weboldalra, controlra, master page-re vonatkozó erőforrások
  • App_Themes: .skin, .css, képek a designhoz
  • App_WebReferences: .wsdl, .xsd (XML Schema), .disco, .discomap
  • Bin: lefordított .dll-ek

Konfiguráció

5 szintű konfiguráció

  • machine.config
  • default web config
  • site-hoz tartozó web.config
  • webalkalmazáshoz tartozó web.config
  • alkönyvtárhoz tartozó web.config
  • .xml formátumúak
  • a specifikusabbak felüldefiniálják az általánosabbakat
  • a Web Site Administration Tool-lal grafikus felületen szerkeszthetők

Web.config részei

  • Biztonsági beállítások
  • Application Settings
  • Providerek

Trace

web.config Application tabján lehet bekapcsolni

Trace beállítása

  • enabled
  • requestLimit: bejegyzések max. száma a memóriában
  • pageOutput: oldalak alján is megjelenjen, vagy csak a trace.axd-ben
  • traceMode: rendezés idő vagy kategória szerint
  • localOnly: csak a helyi kéréseket követi
  • mostRecent: első vagy utolsó néhányat tartsa meg

Trace kategóriák

  • Request Details: alapvető adatok a HTTP kérésről
  • Trace Information: időadatok
  • Control Tree: kontrolok és méretük
  • Session State, Application State, Request Cookies, Respone Cookies, Query String: állapotinformációk
  • Headers Collection: HTTP fejlécek
  • Form Collection: postback-elt adatok
  • Server Variables

Adding and Configuring Server Controls

Szerver oldali controlok használata

Osztályhierarchia

				 Control
					 ^
	 +-----------+---------------+
	 |			  |					|
WebControl  HtmlControl  TemplateControl
										  ^
										  |
										Page

Oldal életciklusa

  1. OnInit (Init): gyerek vezérlők inicializálása.

Ilyenkor a controlok design time beállított attribútumai látaszanak.

  1. LoadControlState, LoadViewState, LoadPostData
  2. Load (OnLoad): a control ilyenkor inicializálva van és helyre van állítva az állapota
  3. RaisePostDataChangedEvent: nem postback események, pl. TextChanged lekezelése
  4. RaisePostbackEvent: postback esemény, pl. Click lekezelése
  5. PreRender
  6. SaveControlState, SaveViewState: állapot mentése
  7. Render
  8. Dispose: nem felügyelt erőforrások (pl. adatbázis kapcsolat) felszabadítása

10. UnLoad: felügyelt erőforrások felszabadítása

Szerver controlok

  • runat="server"
  • Hozzáadás .aspx kódból vagy form1.Controls.Add metódussal
  • Kétféle típusa van: HTML control és web control

HTML controlok

Akkor érdemes használni, ha sima asp oldalt migrálunk, vagy ha az oldalon sok JavaScript kód hivatkozik a controlokra. A HtmlControl osztályból származnak.

  • Egy darab HTML taggé fordul, runat="server" attribútumal
  • Toolbox-on HTML tab
  • Property-k: Attributes, Disabled, Id, Style, TagName, Visible
  • Pl. HtmlImage, HtmlLink, HtmlInputHidden, HtmlInputButton, HtmlInputText.

Web controlok

A WebControl osztályból származnak. Támogatják a PostBack-et.

  • Több HTML taggé fordulhatnak, és JS kód is rendelhető hozzájuk.
  • Rendelkeznek ViewState-tel, ami az oldallekérések között is megtartja a control állapotát.
  • A Control State mindig PostBack-elődik, a ViewState csak akkor, ha megengedjük.
  • Property-k: kinézet beállítása, EnableTheming, SkinID, EnableViewState, TabIndex, ToolTip.
  • Pl. Label, Button, Image, CheckBox, ListBox, GridView

Alapvető web controlok

Az oldalon megjelenő, felhasználótól származó szövegeket ellenőrizni kell, hogy kiszűrjük az XSS támadásokat. Egy lehetséges megoldás: Server.HtmlEncode

Label

  • statikus szöveg megjelenítése
  • rendelkezhet gyorsbillentyűvel, ilyenkor a fókusz az utána következő controlra ugrik
  • stílusozható
  • html kódot is megjeleníthet (pl. <u>)

TextBox

  • Felhasználótól szöveges adatok bekérésére
  • TextMode lehet SingleLine vagy MultiLine
  • Columns, Rows, MaxLength: max. méret beállítása

Button

  • Submit gomb: simán csak postbackel
  • Command gomb: Command esemény vált ki, beállítandó a CommandName és a CommandArgument
  • CausesValidation=true => PostBack előtt validálja a form tartalmát

CheckBox

  • Rendelkezik Text property-vel
  • TextAlign: hol jelenjen meg hozzá a szöveg
  • Ha sok van belőle, érdemes CheckBoxList-et használni helyette
  • Alapból nem postbackel, csak ha beállítjuk az AutoPostBack-et true-ra

RadioButton

  • Rendelkezik Text property-vel
  • GroupName property-vel csoportosítható
  • Ha sok van belőle, érdemes RadioButtonList-et használni helyette

Exploring Specialized Server Controls

Összetettebb webes controlok

Literal

  • statikus szöveg megjelenítése
  • nem renderel <span> taget, mint a Label
  • nem rendelkezik stílussal
  • Mode=PassThrough: egy az egyben megjelenik a HTML forrásban;

Mode=Encode: lecseréli a HTML vezérlőkaraktereket

Table, TableRow, TableCell

  • Sima HTML táblázat runat="server" attribútummal
  • Fix méretű táblázathoz sima <table> taget érdemes használni
  • Táblázat létrehozása kódból: table.Rows.Add(), tableRow.Cells.Add(), cell.Text

Image

  • Kép megjelenítése
  • Leszármazottjai: ImageMap, ImageButton
  • ImageUrl: a megjelenítendő kép URL-je
  • AlternateText: alt attribútum, GenerateEmptyAlternateText-tel mindig legenerálja
  • ImageAlign: NotSet, Left, Right, Baseline, Top, Middle, Bottom, AbsBottom, AbsMiddle, TextTop
  • Nincs Click eseménye, ha kell, ImageButton-t használjunk

ImageButton

  • Kép, ami rendelkezik Click és Command eseményekkel
  • A Click eseményben visszaadja a kattintás pozícióját

ImageMap

  • Képen hot spot-okat lehet definiálni
    • CircleHotSpot (X, Y, Radius)
    • PolygonHotSpot (string Coordinates)
    • RectangleHotSpot (Top, Left, Bottom, Right)
    • imgButton.HotSpots.Add()
  • A PostBackValue adja vissza, hogy melyikre kattintott a felhasználó
  • A korábban hozzáadott hotspot van felül
  • A HotSpotMode attrib]tummal szabályozható, hogy mi történjen kattintáskor (pl. legyen-e PostBack),

és definiálhatók lyukak is

Calendar

  • Naptár az adott hónapról
  • DayRender eseménnyel controlok is elhelyezhetők a cellákban

(e.Cell.Controls.Add())

  • SelectionMode: választható legyen-e nap, hét, hónap

FileUpload

  • TextBox + Browse gomb
  • Nem postbackel, külön gomb kell hozzá
  • Feltöltött file: byte[] FileBytes, Stream FileContent
  • Összetett adatok: HttpPostedFile PostedFile
    • ContentType
    • FileName
  • MapPath metódussal lehet relatív útvonalból abszolútat csinálni. "~" a site gyökérkönyvtára.

Panel

  • Konténer kontrol, <div> taget renderel
  • BackImageUrl: háttérkép
  • HorizontalAlignment: benne lévő controlokat merre igazítsa
  • Wrap: sortörés
  • DefaultButton: enter hatására meylik gomb nyomódjon meg,

bármelyik IButtonControl interfészű control kijelölhető

MultiView

  • Több View controlt tartalmaz, amelyekből egyszerre egyet jelenít meg
  • ActiveViewIndex, SetActiveView(): melyik jelenjen meg
  • Hasonlóan működik, mint a mobil formok

Wizard

  • Több képernyőn keresztül tartó adatgyűjtésre használják
  • Több WizardStepet tartalmaz, amelyekből egyszerre egyet jelenít meg
  • MultiView-ra épül
  • StepType:
    • Start: csak Next gomb
    • Step: közbenső lépés, Previous és Next gomb
    • Finish: Previous és Finish gomb
    • Complete: nincsenek navigációs gombok
    • Auto: index alapján választ
  • Adatok lekérdezése:
foreach (WizardStep ws in wizard.WizardSteps)
	 foreach (Contol c in ws.Controls) {
		  if (c is CheckBox) {
				CheckBox cb = (CheckBox)c;
				// ...
		  }
	 }
	  

Xml

  • Sima vagy XSLT-vel transzformált XML-t jelenít meg
  • forrás: DocumentSource vagy DocumentContent, az utóbbi az erősebb
  • XSLT: TransformSource vagy Transform, az utóbbi az erősebb
  • TransformArgumentList

Adatkötést támogató webes controlok

  • Egyszerű adatkötést támogató controlok:

1D adatforrás, a DataBoundControl-ból (ezen belül ListControl-ból vagy az AdRotator-ból) származnak

  • Összetett adatkötést támogató controlok:

2D adatforrás, CompositeDataBoundControl ősosztály

  • Hierarchikus adatkötést támogató controlok:

HierarchicalDataBoundControl ősosztály

Data Source

  • A controlok hivatkoznak egy DataSourceID-re
  • Az adatforrás lehet lehet IEnumerable, IListSource, IDataSource, IHierarchicalDataSource
  • Konkrét implementációk: AccessDataSource, SqlDataSource, XmlDataSource, ObjectDataSource és SitemapDataSource
  • A megjelenítés gyakran felüldefiniálható template-ek használatával. Ilyenkor az adatokat a template-ekben szereplő kontrolok property-ihez kötjük
    • Tipikus template-ek: HeaderTemplate, FooterTemplate, ItemTemplate, AlternatingItemTemplate, SelectedItemTemplate, SeparatorTemplate, EditItemTemplate

Adatkötés

  • DataBinder.Eval(): egyirányú
  • DataBinder.Bind(): kétirányú
  • Pl. <asp:TextBox text="<%# Eval("ID") %>"%gt;
  • DataBind() híváskor történik meg a tényleges adatkötés
ListControl
  • Items: ListItem kollekció
  • SelectedIndex
  • SelectedItem
  • SelectedValue
  • SelectedIndexChanged
  • AppendDataBoundItems: adatkötéskor nem felülírja, hanem bővíti az elemeket
  • DataSource: adatforrás
  • DataTextField, DataValueField: adatforráson belül honnan jöjjön a szöveg illetve az érték

DropDownList

  • Lenyíló lista

ListBox

  • Sima lista, egyszerre több elem is kiválasztható, ha SelectionMode=Multiple
  • Items[i].Selected: ki van-e választva

CheckBoxList, RadioButtonList

  • Több oszlopos / soros is lehet (RepeatColumns, RepeatDirection)

BulletedList

  • <ul>-lé vagy <ol>-lé fordul
  • BulletStyle: Disc, Circle, Square, LowerAlpha, UpperAlpha, stb.
  • FirstBulletNumber: kezdő sorszám
  • DisplayMode: Text, LinkButton, HyperLink
AdRotator

XML file-ból (pl. App_Data/ads.config) konfugurálható. Advertisements/Ad/

  • Keyword: kategória
  • ImageUrl
  • NavigateUrl
  • AlternateText
  • Impressions: megjelenés gyakorisága

AdvertisementFile: adatforrás

Összetett adatkötést támogató controlok

GridView

  • Táblázatos formában jeleníti meg az adatokat
  • Támogatja az adatok szerkesztését és törlését
  • GridViewRow[] Rows, a GridViewRow a TableRow-ból származik
    • RowCreated: sor létrejöttekor hívodik meg, az adatok még nem állnak rendelkezésre
    • RowDataBound: adatok már rendelkezésre állnak a sorban
  • DataControlField[] Columns
    • Oszlop típusok (DataControlField leszármazottjai:

ButtonField, CommandField, AutoGeneratedField, CheckBoxField, TemplatField, ...

  • Sorokon belül DataControlFieldCell[] Cells
  • Felüldefiniálhatók az InitializeRow és InitializeCell metódusok

DetailsView

  • Egy rekord mezőit jeleníti meg egymás alatt, egy tánlázatban
  • Támogatja az adatok beszúrását, szerkesztését és törlését
  • A rekordok között lapozással lehet váltani, de rendezni már nem

FormView

  • Egy rekord mezőit jeleníti meg tetszőleges formázással
Hierarchikus adatkötést támogató controlok

XML (XmlDocument), táblázatos adatforrás, adatbázis (DataRelation-öket is tartalmazó DataSet) és sitemap is használható adatforrásként. Az adatforrásnak implementálnia kell az IHierarchicalDataSource interfészt.

TreeView

  • Fa formájában jeleníti meg az adatokat, lehet több gyökér is
  • Egy csúcsot egy TreeNode objektum reprezentál (Text, Value, NavigateUrl)
  • XML adatforrás
    • Tetszőleges XML file-t elfogad
    • <asp:TreeNodeBinding

DataMember="xml tag név" TextField="megjelenő szöveget tartalmazó attribútum" ValueField="értéket tartalmazó attribútum" />

Menu

  • Legtöbbször SiteMapDataSource-szal használják
  • Elemei (Items) MenuItem típusúak
  • XML adatforrás: tetszőleges tag neveket tartalmazhat, de a gyökéren kívül minden elemnek legyen

display és url attribútuma. Bekötéskor az XmlDataSource attribútumaként a file nevet (DataFile) és azon belül egy részfát (XPath) kell megadni.

Using ADO.NET and XML with ASP.NET

Kapcsolat nélküli osztályok

DataTable

  • Memóriabeli adatbázis tábla
  • A sémát az DataColumn objektumok definiálják
    • Caption, DataType, MaxLength, Unique, AllowDBNull, DefaultValue, Expression
    • Primary key definiálása: datatable.PrimaryKey = new DataColumn[] { col }
  • Az adatokat a DataRow objektumok tartalmazzák
    • datatable.Rows.Add(row)
    • datatable.Rows.Add(érték, érték, ...)
    • datatable.LoadDataRow(row, LoadOption)
      • LoadOption.OverwriteRow: felülírja a commitolt és a nem commitolt változatot
      • LoadOption.PreserveCurrentValues: csak a commitolt változatot írja felül
      • LoadOption.UpdateCurrentValues = LoadOption.Upsert: csak a nem commitolt változatot írja felül
    • datatable.ImportRow(): sor beszúrása másik táblából, ha még nincs azonos kulcsú rekord
    • AcceptChanges: commit
    • RejectChanges: rollback
  • Copy(): séma és adatok klónozása
  • Clone(): séma klónozása
  • Load(): betöltés pl. IDataReader-ből

DataRowVersion: egy sorból legfeljebb három verzió tárolódhat

  • Current: újonnan hozzáadott vagy módosított, de még nem commitolt változat
  • Original: commitolt változat
  • Proposed: szerkesztés alatti változat (BeginEdit() híváskor).

EndEdit() után átíródik a Current változatba és megszűnik létezni.

  • Default: újonnan hozzáadott vagy módosított sorban Current, szerkesztés alatti sorban Proposed,

törölt sorban exception-t dob

DataTable exportálása

  • WriteXml() metódussal
    • Első argumentuma a file
    • Második opcionális argumentuma XmlWriteMode.WriteSchema ↔ az XML sémát exportálja.
  • A DataColumn ColumnMapping property-jével szabályozható, hogy hogyan exportálja
    • Attribute: XML attribútumként
    • Element: XML element belsejébe
    • Hidden: ne exportálja (pl. számított mezőket)
    • SimpleContent: szövegként, burkoló element nélkül
  • A speciális karaktereket escape-eli az XML-ben, pl. a space-ből _x0020_ lesz.

DataView

  • Adatbázis tábla egy részét reprezentálja (SELECT)
  • GridView-hoz köthető adatforrásként
  • Property-k
    • Sort: pl. "LastName ASC, FirstName ASC, Salary DESC"
    • RowFilter: pl. "LastName like 'A%' and Salary > 15"
    • RowStateFilter: pl. Added, Unchanged, CurrentRows, OriginalRows
    • AllowNew, AllowEdit, AllowDelete: milyen műveletek megengedettek rajta

DataSet

  • Memóriában tárolt relációs adatbázis tábla
  • A séma felépíthető kódból, vagy importálható XML sémából
    • DataTable datatable = dataset.Tables.Add("tábla neve")
    • DataRelation datarelation = dataset.Relations.Add("reláció neve", kulcs oszlop, idegen kulcs oszlop)
  • Adatkötés DataSet-hez: DataSource=DataSet neve, DataMember=DataTable neve
  • XML sémából generálható típusos DataSet.
  • WriteXml() hívással exportálhatók az adatok és a séma. Az XmlWriteMode.DiffGram hívás a különböző sor verziókat is exportálja.
  • ReadXml() hívással importálhatók az adatok és a séma. Az XmlReadMode felsorolással szabályozható a beolvasás módja.
    • Auto: a file alapján választ módon
    • DiffGram: diffgram-ot importál
    • IgnoreSchema: nem olvassa be a sémát
    • InferSchema: az adatok alapján állítja elő a sémát, adattípusnak mindenhol stringet használ
    • InferTypesSchema: az adatok alapján állítja elő a sémát, az adattípust is megpróbálja kitalálni.

Ha nem sikerül, stringet használ.

    • ReadSchema: beolvassa a beágyazott sémát
  • BinaryFormatter segítségével binárisan is sorosítható a DataSet. Ehhez a RemotingFormat property-t true-ra kell állítani. A bináris sorosítás nagyobb headert generál, mint az XML, de az adatokat tömörebben ábrázolja.
  • A Merge() metódussal kombinálható két DataSet.

Az összefésülés a MissingSchemaAction argumentummal szabályozható.

    • Add: a sémát szükség esetén kiegészíti az új tablákkal és oszlopokkal
    • AddWithPrimaryKey: a sémát az előbbiek mellett még elsődleges kulcsokkal is kiegészítheti
    • Error: hiányzó oszlop esetén hibát dob
    • Ignore: csak a közös oszlopokat fésüli össze

DataRelation

  • Alapból csak navigáció a táblák között
    • Navigáció lefelé: DataRow[] childRows = row.GetChildRows(datarelation)
    • Navigáció felfelé: DataRow parentRow = row.GetParentRow(datarelation)
  • Konstruktorban megadható, hogy idegen kulcsot definiáljon
  • Kaszkád módosítás és törlés
    • Cascade: a gyerek táblákban is módosítja az elsődleges kulcsokat illetve törli a hivatkozó sorokat
    • None: InvalidContraintException: nem engedi meg a kulcs változtatását,

és sort is csak akkor töröl, ha nincs rá hivatkozás

    • SetDefault: a szülő táblában kulcs változáskor vagy sor törlésekor

a gyerek tábla kapcsolódó soraiban az alapértékre állítja a kulcsot

    • SetNull: a szülő táblában kulcs változáskor vagy sor törlésekor

a gyerek tábla kapcsolódó soraiban az null-ra állítja a kulcsot

Kapcsolattal rendelkező osztályok

  • Ősosztályok: DbConnection, DbCommand, DbDataAdapter, DbProviderFactory, DbProviderFactories
  • Implementációs osztályok: OleDb, Odbc, Sql, Oracle előtaggal ugyanezek

TODO: milyen adatokat tartalmaz a connection string

Connection string tárolása a web.config file-ban

  • connectionStrings/clear: a beépített connection stringek (pl. machine.config-ból érkezők) törlése
  • connectionStrings/add: name, providerName, connectionString attribútumokat kell megadni

Connection Pool használata

  • Connection stringben
    • Pooling=true
    • Connection Timeout: kapcsolat felépítési timeout
    • Min Pool Size, Max Pool Size: az előbbit érdemes 0-nál nagyobbra venni,

hogy hosszab szünet után is jó maradjon a válaszidő

    • Connection Lifetime: meddig maradjon a kapcsolat a poolban
  • Az egy poolban szereplő kapcsolatok connection stringje meg kell, hogy egyezzen
  • Azonosnak kell lennie a felhasználó és a processz azonosítójának
  • A connection poolt az adatbázis kliens tárolja.

Connection string titkosítása

  • aspnet_regiis -pef "connectionStrings" "site könyvtára"
  • kódból: DPAPI vagy RSA használatával

TODO: DbCommand, DbDataReader használata

  • Az InfoMessage eseményre feliratkozva visszakapjuk az adatbázisban print-tel kiírt szöveget

MARS (Multiple Active Result Sets)

  • MultipleActiveResultSets=true a connection stringben
  • Egy kapcsolattal párhuzamosan több lekérdezés is futtatható
  • Egyszerűsíti a programozást, de csökkenti a teljesítményt, ezért kerüljük

SqlBulkCopy

  • Adatbázis feltöltése gyorsan különböző adatforrásokból (DataRow, DataTable, IDataReader)
  • DestinationTableName: cél tábla
  • WriteToServer(adatforrás)

DbDataAdapter

  • Adatok szinkronizálása az adatforrás és a DataTable között
  • DbCommand SelectCommand az adatforrás olvasásához
  • InsertCommand, UpdateCommand, DeleteCommand (mind) az adatforrás írásához
  • dataadapter.Fill(dataset, "tábla név"):

a dataSet-ben létehoz és feltölt egy táblát

  • dataAdapter.Update(dataset, "tábla név"):

az adatbázis táblát szinkronizálja a DataSet megadott táblájával.

    • DbCommandBuilder: legeneráltathatók vele az InsertCommand, UpdateCommand, DeleteCommand parancsok.

A generált parancsok nem védettek az Sql Injection ellen, érdemes inkább tárolt eljárásokat használni.

    • A szinkronizálás végezhető batch módban is,

ehhez az UpdateBatchSize-t kell 0-ra vagy 1-nél nagyobbra állítani.

    • Minden sor illetve batch szinkronizálása után meghívódik a RowUpdated esemény,

ahonnan a RecordsAffected property segítségével kérdezhető le a megváltozott sorok száma

DbProviderFactory

  • Ennek segítségével tehető adatbázisfüggetlenebbé az alkalmazás
  • Metódusai: CreateCommand(), CreateConnection(), ...
  • Implementációi: SqlClientFactory, OracleClientFactory, OleDbFactory, OdbcFactory singleton osztályok
  • A DbProviderFactories.GetFactoryClasses() metódussal kérdezhető le a factory-k listája

Tranzakció kezelés

  • using (SqlTransaction tran = connection.BeginTransaction()) { ... }
  • végén tran.Commit()
  • ha hiba történt, pl. Exception, tran.RollBack()

Aszinkron adatbázis hozzáférés

  • Ha egy oldalletöltéshez több SELECT kell, hatékonyabb lehet őket aszinkron módon, egyszerre futtatni.
  • Connection stringbe bele kell írni, hogy Asynchronous=true
  • Metódusok: command.BeginExecuteReader(), command.EndExecuteReader()

Bináris adatok tárolása adatbázisban

  • Olvasás
    • SqlDataReader rdr = cmd.ExecuteReader(CommandBehaviour.SequentialAccess)
    • rdr.GetBytes()-szal lehet szakaszonként kiolvasni, ha 0-val tér vissza, vége a streamnek
  • Írás
    • SELECT textptr(logo) FROM tabla
    • UPDATETEXT tabla.logo @Pointer @Offset null @Data

XML használata

XmlDocument: DOM kompatibilis XML dokumentum implementáció

  • Create...(): adott típusú node létrehozása (CreateElement, CreateAttribute, ...)
  • CloneNode(deep): node lemásolása
  • GetElementById(), GetElementByTagName(): node keresése
  • ImportNode(): node beillesztése másik XML dokumentumból
  • InsertBefore(), InsertAfter(): node beszúrása
  • Load(): betöltés file-ból vagy streamből, letöltés url-ről
  • LoadXml(): betöltés stringből
  • Normalize(): szomszédos szöveges node-okat összeolvasztja
  • AppendChild(), PrependChild(): beszúrás utolsó illetve első gyerekként
  • ReadNode(): XmlTextReaderrel beolvassa a következő node-ot
  • RemoveAll(): csúcs rekurzív törlése
  • RemoveChild(): gyerek törlése
  • ReplaceChild(): csúcs beszúrása vagy átmozgatása egy adott node alá
  • Save(): mentés file-ba, stream-be vagy url-re
  • XmlNodeList SelectNodes(): visszaadja az XPath mintára illeszkedő összes csúcsot
  • XmlNode SelectSingleNode(): visszaadja az XPath mintára illeszkedő első csúcsot
  • WriteTo(): XmlTextWriter-rel kiír egy csúcsot
  • WriteContentsTo(): XmlTextWriter-rel kiír egy csúcsot és az összes gyerekét
  • Attribútum létrehozása
XmlAttribute xmlattr = xmldoc.CreateAttribute("ID");
xmlattr.Value = "1";
xmlElement.Attributes.Append(xmlattr);
	  

XmlDataDocument: DataSet-ből sorosított XmlDocument

XPathNavigator: XML fát tud rekurzívan bejárni

  • létrehozás: xmldoc.CreateNavigator()
  • mozgás:
    • MoveToRoot()
    • HasAttributes, MoveToFirstAttribute(), MoveToNextAttribute()
    • HasChildren, MoveToFirstChild(), MoveToNext()
    • MoveToParent()

XmlTextWriter: XML file-ok írását támogató osztály

  • Formatting: XML formázása, pl. Formatting.Indented
  • Indentation: behúzás mértéke
  • WriteStartDocument()
  • WriteComment()
  • WriteStartElement()
  • WriteAttributeString()
  • WriteEndElement()
  • WriteElementString()
  • XmlConvert osztállyal lehet .NET-es típusokat (pl. DateTime) XML-es típusokká alakítani

XmlTextReader: XML beolvasása sorosan, nem pufferelt módon

  • Read(): következő node beolvasása; false, ha vége a file-nak
  • NodeType: XmlDeclaration, Element, Comment, Text, stb.
  • Name: element esetén a neve
  • Value: szöveges element tartalma, komment tartalma, stb.
  • HasAttributes
  • MoveToNextAttribute(), kiolvasás: Name és Value lekérdezésével

XmlReader: XML beolvasása validálással

  • Létrehozás: XmlReader.Create(string filename, XmlReaderSettings settings
    • filename: DTD-vel egybekötött XML file
    • XmlReaderSettings.ValidationType: None, DTD, Schema
    • XmlReaderSettings.ProhibitDTD: DTD validálás esetén false-ra kell állítani
  • Validálás: new XmlDocument().Load(xmlreader)

Creating Custom Web Controls

User Controlok készítése

Designerrel összeállítható, a weboldalakkal azonos felépítésű. .ascx kiterjesztésű file-ba kell menteni. Az .ascx-eket minden projektbe be kell másolni, ahol föl szeretnénk használni a controlt.

Különbségek a weboldalakhoz képest

  • A @Page helyett @Control direktívát kell használni az oldal elején
  • A @Control Inherits attribútumát át kell írni System.Web.UI.UserControl-ra
  • A control nem tartalmazhat <html>, <head>, <body> és <form> tageket
  • .aspx helyett .ascx kiterjesztést kell használni

Control használata

  • Legegyszerűbb, ha a designerben ráhúzzuk az oldalra
  • Betöltés: @Page alá <%@ Register Src="MyControl.ascx" TagName="MyControl" TagPrefix="uc1" %>
  • Használat:
    • aspx-ből: <uc1:MyControl runat="server" />
    • kódból: form1.Controls.Add((MyControl)LoadControl("MyControl.ascx"))
  • A control önmagában nem pozicionálató, ehhez előbb be kell rakni egy Panel-ba.

Control írása

  • A controlban definiálhatunk publikus property-ket, ami elérhető aspx-ből és kódból is
  • A control részei által kiváltott eseményeket a control kódjában kezeljük le
  • Saját esemény definiálása
public delegate void MyEventHandler(string message);
public event MyEventHandler MyEvent;
if (MyEvent != null) MyEvent("Hello");
	  

Templated User Control

Lehetővé teszi az adatok és a megjelenítés elválasztását.

  • Az .ascx-ben a template-ek helyét jelezni kell egy-egy PlaceHolder controllal
  • A code behind file-ban definiálni kell egy ITemplate típusú property-t
    • El kell látni [TemplateContainer(típus)] attribútummal és
    • [PersistenceMode(PersistenceMode.InnerProperty)] attribútummal
  • Az App_Code könyvtárban létre kell hozni egy Controlból leszármazó, INamingContainer-t

implementáló osztályt. Ez fogja tartalmazni a template egy példányát.

Custom Web Control készítése

Lefordítható .dll file-lá, és referencia hozzáadásával felhasználható több alkalmazásban is.

Létező control leszármaztatásával

  • Render() metódust kell felüldefiniálni
  • A Render() metódus megkap argumentumként egy HtmlTextWriter-t
    • WriteFullBeginTag(): üres tag kiírása
    • Write(): tetszőleges szöveg kiírása
    • WriteEndTag(): záró tag kiírása

WebControl osztály leszármaztatásával

  • Akkor érdemes használni, ha nincs a kívánthoz hasonló viselkedésű leszármaztatható control

Control integrálása a Visual Studioba

  • Toolboxon jobb gomb, Choose Items, dll kiválasztása
  • Megadható egy 16x16-os bmp ikon a [ToolboxBitmap] attribútummal:

[ToolboxBitmap(typeof(MyControl), "MyControlIcon.bmp"]

  • A property-k közül megjelölhető egy [DefaultProperty] attribútummal, a designerben ez kapja a fókuszt
  • [ToolboxData]: hogyan egészítse ki az .aspx kódot

[ToolboxData("<{0}:MyControl runat=\"server\" Attr1=\"value1\" Attr2=\"value2\" />")]

  • [TagPrefix]: milyen előtagot használjon

[assembly: TagPrefix("MyControl", "mc1")]

  • Designerben mutatott kinézet megváltozatása:
    • Adjuk hozzá a projekthez egy referenciát a System.Design.dll-re
    • Hozzunk létre egy ControlDesigner-ből származó osztályt
    • Definiáljuk felül a GetDesignTimeHtml() metódust
    • Definiáljuk felül az Initialize() metódust, ahol átvesszük a controlt IComponent-ként
    • A kontrolhoz adjunk hozzá egy attribútumot:

[Designer("MyControlLibrary.MyControlDesigner, MyControlLibrary")]

Composite control készítése

Control összeállítása más controlokból. A CompositeControl osztályból származik. Nincs design nézete.

  • A felüldefiniált CreateChildControls metódusban kell példányosítani a gyerek controlokat (Controls.Add())
  • Ha szükség van Style attribútumra, a gyerek controlokat egy Panel-ben kell elhelyezni
  • A gyerek controlokra FindControl("id") hívással lehet hivatkozni

Templated control készítése

  • Az App_Code könyvtárban létre kell hozni egy konténer osztályt (pl. ProductContainer)
    • Kell egy referencia a System.Web.dll-re
    • Control legyen az ősosztálya és implementálja az INamingContainer interfészt
    • Tartalmazza a template-ben használható property-ket (pl. ProductName)
  • Létre kell hozni egy osztályt, ami a controlt fogja implementálni
    • Control legyen az ősosztálya és implementálja az INamingContainer interfészt
    • Osztály elé [ParseChildren(true)] attribútum
  • Legyen egy ITemplate típusú property-je (pl. ProductTemplate)
    • [TemplateContainer(típus)]
    • [PersistenceMode(PersistenceMode.InnerProperty)]
  • A DataBind() metódusban meg kell hívni az EnsureChildControls() metódust
  • CreateChildControls() metódust felüldefiniálni, hogy példányosítsa (ITemplate.InstantiateIn()) és

helyezze el a konténerben a template-et.

Használat:

<uc1:ProductControl runat="server" ...>
	 <ProductTemplate>
		  <%# Container.ProductName %>
	 </ProductTemplate>
</uc1:ProductControl>

Input Validation and Site Navigation

Bemenet ellenőrzése

Az ASP.NET támogatja mind a szerver, mind a kliens oldali validációt. Az előbbi hatékony védekezést nyújt az egyedileg összeállított, támadó HTTP kérések ellen, az utóbbi pedig a teljesítményt növeli.

  1. Húzzunk fel egy validátor controlt az ellenőrizendő control mellé
  2. Állítsuk be a ControlToValidate property-jét
  3. Állítsuk be az ErrorMessage property-jét
  4. Másoljuk be az ErrorMessage-et a ToolTip-be is
  5. A Text property-jét állítsuk "*"-ra

A ValidationSummary controllal egy helyen megjeleníthető az összes hibaüzenet.

A Page Validators gyűjteménye tartalmazza az összes validátort. Kézi ellenőrzést a Validate() metódus hívásával tudunk kiváltani, ami egyébként automatikusan a Page_Load() után futna le. A Validate() beállítja a Page.IsValid attribútumot.

BaseValidator

  • ControlToValidate
  • Display:

None (egyáltalán nem ír hibaüzenetet), Static (visibility:hidden, ha nincs), Dynamic (display:none, ha nincs)

  • EnableClientSideScript: kikapcsolásával tesztelhető a szerver oldali ellenőrzés
  • ErrorMessage: hiba esetén ezt jeleníti meg
  • IsValid: control státusza érvényes-e

RequiredFieldValidator

  • Érvényes, ha a beírt szöveg tartalmaz nem white space-t
  • Megadható egy InitialValue, amit mindenképp át kell írni

CompareValidator

  • Típust ellenőriz (Currency, Date, Double, Integer, String)
  • Megadható egy relációs feltétel is: ValueToCompare és Operator

RangeValidator

  • Ellenőrzi a beírt adat típusát (Type property)
  • Ellenőrzi, hogy a megadott [MinimumValue, MaximumValue] intervallumba esik-e

RegularExpressionValidator

  • Reguláris kifejezést próbál illeszteni a beírt értékre

CustomValidator

  • Megadható neki egy JavaScript függvény az alábbi szignatúrával:

function ClientFunctionName(source, arguments)

    • arguments property-i: Value, IsValid
  • A ServerValidate eseményben végzi a szerver oldali ellenőrzést

Részleges validáció

  • A controlok CausesValidation property-jét false-ra állítva kihagyható a validáció
  • A controlok ValidationGroup-okba sorolhatók. Egy gomb csak a vele azonos csoportban lévő controlokat validálja postback előtt.

Navigáció

HyperLink

  • NavigateUrl: cél
  • <a> taggé fordul
  • Nem okoz postbacket

document.location

  • Javascripttel is megoldható az átirányítás
  • Pl. <input type="button" onclick="document.location='NavigateTest2.aspx'">

Postolás másik oldalra

  • Az előző oldal adataira a PreviousPage property-n keresztül kaphatunk referenciát
  • A rajta lévő controlokat PreviousPage.FindControl() hívással érjük el
  • A PreviousPageType direktíva használatával típusosan is elérhetjük az előző oldalt:

<%@ PrevoiusPageType VirtualPath="~/NavigateTest.aspx" %>

Response.Redirect()

  • A szerver 302-es kódú HTTP választ küld, aminek hatására a kliens átirányítást kér
  • A Response.BufferOutput-ot true-ra kell állítani, különben a HTTP fejlécet korábban kiküldi

Server.Transfer()

  • Szerver oldalon irányít át egy másik oldalra
  • Argumentumként megadható, hogy megőrizze-e a query stringet

Sitemap

  • Web site szerkezetét leíró XML file
    • Elemei siteMapNode-ok url, title és description attribútumokkal.
  • SiteMapDataSource-ként köthető Menu, TreeView és SiteMapPath controlokhoz
  • Site map bejárása (pl. ha akarunk minden oldalra egy "Fel" gombot)
    • RootNode
    • CurrentNode: az aktuális oldal hol található a site map-ben
    • ParentNode, ChildNodes
    • NextSibling, PreviousSibling

ASP.NET State Management

Kliens oldali állapotkezelés

Előnyök: jobb skálázhatóság, a site több webszerveren is futtatható párhuzamosan.

ViewState: controlok állapotát tárolja.

  • Tetszőleges sorosítható objektumot tartalmazhat, kódból is olvasható-írható
  • Oldal újratöltésekor elveszi, csak PostBack-kor marad meg
  • Kliens oldalon __VIEWSTATE azonosítójú hidden input mezőbe íródik
  • Titkosítható
    • Globálisan: web.config-ban <pages viewStateEncryptionMode="Always"/>
    • Lokálisan: @Page direktívában ViewStateEncryptionMode="Always"
  • A teljesítmény növelése érdekében controlonként kikapcsolható (EnableViewState=false)

ControlState: control állapotát tárolja, de nem kikapcsolható

  • OnInit() metódusban meghívni a RegisterRequiresControlState()-et
  • Felüldefiniálni a SaveControlState és LoadControlState metódusokat

HiddenField

  • Rejtett adattároló mező, a form submit-olásakor a kliens elküldi a szervernek
  • Explicit módon kell hozzáadni az oldalhoz
  • Nincs beépített tömörítés, titkosítás, stb.
  • A Value property-vel lehet kiolvasni

Cookie

  • Böngészőben tárolódik, bezárás után is megmaradhat az értéke
  • String típusú
  • A szerver HTTP fejlécben állítja be az értékét és ugyanitt kapja vissza minden oldalletöltéskor
  • HttpCookie property-i: Value, Expires, Path, Domain
    • Hierarchikus adatok tárolására is alkalmas:

Response.Cookies["info"]["visit"].Value = DateTime.Now.ToString();

  • Lekérdezés: Request.Cookies["név"]
  • Beállítás: Response.Cookies["név"]
  • Törlés: az Expires property-t múltbeli időpontra kell állítani
  • Nyomon követés: trace.axd oldalon

Query string

  • URL végén, ? karakter utáni rész
  • Hasznos, ha egy dinamikusan generált oldalt (pl. keresési eredményeket) szeretnénk felvenni

a könyvjelzők közé

  • Korlátos hosszú lehet (max 2 KB)
  • A felhasználó nagyon könnyen módosíthatja
  • Olvasás: Request.QueryString["név"]

Szerver oldali állapotkezelés

Előnyök: biztonságosabb (a felhasználó nem írhatja át az állapotot), és kisebb sávszélességet igényel.

Application State: alkalmazásra vonatkozó globális beállítások

  • Nem perzisztens, web szerver újraindításakor elveszik
  • Tetszőleges típusú objektumot tárolhat
  • Olvasás/írás: Application dictionary-n keresztül
  • Elosztott hozzáférés miatt lockolni kell: Application.Lock(), Application.Unlock()
  • Alkalmazás események: a global.asax-ban lehet eseménykezelőket írni hozzájuk
    • Application_Start
    • Application_End
    • Application_Error
    • Session_Start
    • Session_End

Session State: felhasználóra vonatkozó beállítások

  • Felépítés szempontjából megegyezik az alkalmazás állapotával
  • Nem szükséges szinkronizáció
  • Ha nincs rá szükség, kikapcsolható
    • Globálisan a web.config-ban: <sessionState mode="off"/>
    • Lokálisan a @Page direktíva EnableSessionState attribútumát kell false-ra állítani
  • A session azonosító legtöbbször cookie-ban tárolódik, de bele lehet kódolni az URL-be is:

<sessionState cookiless="true" regenerateExpiredSessionId="true"/>

  • Session State mód: hol tárolódjanak a session adatok. <sessionState sessionStateMode="..."/>
    • InProc: leggyorsabb, de nem skálázható
    • StateServer: ASP.NET State Service-nek futnia kell hozzá
    • SQLServer: adatbázisban; lassabb, mint a state server
    • Custom: mi írjuk a providert
    • Off: nincs session kezelés

Profilok: felhasználóra vonatkozó perzisztens beállítások

  • A profil típusosan érhető el
  • SqlProfileProvider-rel tárolható adatbázisban, saját providerrel bárhol

Programming the Web Application

Hibakezelés

try-catch

  • Lokális hibákat kap el
  • Nem fed le minden hibalehetőséget

Page_Error

  • A hiba a Server.GetLastError() hívással kérdezhető le és
  • Server.ClearError() hívással törölhető ki a sorból
  • A hiba oka nem jeleníthető meg a controlokban (azok ilyenkor nem elérhetők), de a Trace-re lehet írni

Application_Error

  • A hibák globálisan is elkaphatók a global.asax Application_Error eseménykezelőjében
  • Server.GetLastError() és Server.ClearError() ugyanúgy működik
  • Átirányítás a hibaoldalra: Server.Transfer("error.aspx");

Web.config elérése kódból

  • Konfigurációs file lekérdezése:

Configuration cfg = WebConfigurationManager.OpenWebConfiguration("/MyApp");

  • A web.config szakaszokból áll (PagesSection, AuthenticationSection, stb.)
  • Szakasz típusos lekérdezése (a GetSection() object-et ad vissza):

TraceSection trace = (TraceSection) cfg.GetSection("system.web/trace") vagy
TraceSection trace = (TraceSection) WebConfigurationManager.GetSection("system.web/trace")

  • Beállítások módosítása: trace.Enabled = true;
  • Konfigurációs file mentése: cfg.Save() vagy cfg.SaveAs().

A mentés szabályozható a ConfigurationSaveMode felsorolással:

    • Full: minden property-t ment
    • Minimal: csak azokat a property-ket menti, amik eltérnek az örökölt értéktől
    • Modified: csak azokat a property-ket menti, amik eltérnek az örökölt vagy a default értéktől

Aszinkron weboldal programozás

Akkor hasznos, ha a weboldalak renderelése pl. Web Service hívás miatt sokáig tart, mert ilyenkor nagy terhelésnél betelik a thread pool és megnő a válaszidő.

Aszinkron weboldal készítése

  • <%@ Page Language="C#" Async="true" AutoEventWireUp="true" %>
  • Definiáljunk aszinkron eseményeket
    • IAsyncResult BeginGetAsyncData(object src, EventArgs args, AsyncCallback cb, object state) { }
    • void EndGetAsyncData(IAsyncResult ar) { }
  • Regisztráljuk be az eseményeket
BeginEventHandler bh = new BeginEventHandler(this.BeginGetAsyncData);
EndEventHandler bh = new EndEventHandler(this.EndGetAsyncData);
AddOnPrePenderCompleteAsync(bh, eh);
	  

Nem HTML oldalak generálása

Képek lekérésekor a vezérlés alapból nem adódik át C# kódnak. Helyette a webszerver megkeresi a képet a filerendszerben, és közvetlenül visszaadja a böngészőnek.

Dinamikus kép/doc/stb. generálás

  • Létre kell hozni egy osztályt, ami megvalósítja az IHttpHandler interfészt
    • IsReusable: egy IHttpHandler példány használható-e több kérés kiszolgálására
    • ProcessRequest(HttpContext context): kiszolgáló metódus
context.Response.ContentType = "image/jpeg";
// TODO: kép generálása
		  
  • Az IIS-ben be kell konfigurálni, hogy a .jpg file-okat is generálja
    • IIS Manager / Web site properties vagy Virtual Folder Properties / Directory tab / Configuration
    • Add/Edit Application Extension Mapping, Executable: aspnet_isapi.dll, "Check that file exist"-et kikapcsolni
  • Web.config-ot is át kell állítani
    • system.web/httpHandlers-be <add verb="*" path="*.jpg" type="ImageHandler"/>

Request, Response, Server, Context osztályok

Request: az aktuális kéréssel kapcsolatban kérdezhetők le tőle információk

  • MapPath(): virtuális → abszolút útvonal konverzió
  • SaveAs(): kérés mentése file-ba
  • ValidateInput(): ellenőrzi, hogy az input tartalmaz-e potenciálisan veszélyes karaktereket
  • ApplicationPath: alkalmazás gyökérkönyvtára
  • Browser: lekérdezhető vele a böngésző neve, verziója és képességei (frame, cookie, JavaScript, stb.)
  • Cookies: böngészőtől érkező cookie-k
  • FilePath, Patrh: a kérés relatív útvonala
  • Files: a feltöltött file-ok
  • Headers: HTTP fejlécek
  • HttpMethod: GET, POST vagy HEAD
  • IsAuthenticated: a kliens be van-e jelentkezve
  • IsLocal: true, ha a helyi gépről érkezett a kérés
  • IsSecureConnection: a protokoll HTTP vagy HTTPS-e
  • LogonUserIdentity: bejelentkezett Windows felhasználó
  • Params: QueryString, Form, ServerVariables és Cookies egyben
  • UrlReferrer: az előző kérés URL-je
  • UserAgent: a böngészőt leíró string
  • UserHostAddress, UserHostName: a kliens IP címe illetve domain neve
  • UserLanguages: preferált nyelvek listája

Response: a HTTP választ lehet összeállítani vele

  • AppendHeader(): http fejlécet fűz hozzá a válaszhoz
  • Clear(): válasz stream ürítése
  • ClearContent(): válasz stream törzsének ürítése
  • ClearHeader(): válasz stream fejlécének ürítése
  • Flush(): a válasz részleges elküldése
  • Redirect(): 302-es, átirányító választ ad
  • TransmitFile(): egy file-t átad pufferelés nélkül
  • Write(): egy file-t átad puffereléssel
  • WriteSubstitution(): a cache-elt válaszban kicserél stringeket
  • Cookies
  • Buffer: pufferelve van-e a válasz. Akkor érdemes kikapcsolni, ha a válasz nagyon nagy, vagy sokáig tart az előállítása
  • Cache, Expires, ExpiresAbsolute: caching policy
  • Status, StatusCode: HTTP válaszkód

Server: segédfüggvények URL-ek, útvonalak és HTML kezeléshez

  • GetLastError(): utolsó nem elkapott hiba
  • ClearError(): hibák törlése
  • HtmlEncode(), HtmlDecode(): <, >, stb. karakterek helyettesítése
  • MapPath(): virtuális → fizikai útvonal leképzés
  • Transfer(): átirányítás szerver oldalon, az URL nem változik a böngészőben
  • UrlDecode(), UrlEncode: URL escape-elése

Context: hozzáférést ad a Cache, Request, Response, Server és Session objektumokhoz

Page.Header: <head> szerver oldali megfelelője

  • Title: <title>
  • StyleSheet: CSS stílusok regisztálása

Page.Header.StyleSheet.CreateStyleRule(Style style, ?, "tag név")

Customizing and Personalizing a Web Application

Master page

Master page: egységes kinézetet (layout) ad a site oldalainak.

  • Kiterjesztése .master
  • @Page helyett @Master direktívát kell használni
  • A változó tartalom helyét ContentPlaceHolder controlokkal lehet kijelölni

Tartalom oldal

  • .aspx oldalon kell megvalósítani
  • A @Page direktíva MasterPageFile attribútumával kell a master page-re hivatkozni
  • Globálisan is lehet master page-et beállítani a web.config-ban:

<pages masterPageFile="MasterPage.master"/>

  • <html>, <head>, <body> és <form> a master page-től öröklődik
  • A tartalmat egy Content controlban kell elhelyezni, ami hivatkozik a ContentPlaceHolder-re

Master page programozása

  • Típusos elérés a @MasterType direktívával

<%@ MasterType virtualpath="~/MasterPage.master" %>

  • A cím oldalanként megváltoztatható a @Page direktíva Title property-jével
  • Bővíthető egyéni property-kkel, amit a ViewState-be érdemes menteni.

Megfontolandó a property-k kihelyezése a konfigurációs file-ba.

  • Controlok elérhetők FindControl() hívással, vagy kivezethetők property-ként

Életciklus

  1. Master controlokon Init
  2. Content controlokon Init
  3. Master oldalon Init
  4. Content oldalon Init
  5. Content oldalon Load
  6. Master oldalon Load
  7. Content controlokon Load
  8. Content oldalon PreRender
  9. Master oldalon PreRender

10. Master controlokon PreRender 11. Content controlokon PreRender

Beágyazott master page

  • <%@ Master Language="C#" master="Parent.master" %>
  • <Content>-en belül újabb <ContentPlaceHolder>-eket tartalmaz

Master page-ek cseréje

  • Újra kell tölteni hozzá az oldalt, nem elég a postback:
Session["masterpage"] = "Master2.master";
Response.Redirect(Request.Url.ToString());
	  
  • Page_PreInit-ben lehet utoljára megváltoztatni a master page-et:

if (Session["masterpage"] != null) MasterPageFile = (string) Session["masterpage"]

Témák használata

Témák használatával egységessé tehető a weboldalak design-ja. Téma (theme) = skin + css + képek.

Az ASP.NET-es control attribútumok többféle helyről kaphatnak értéket. Sorrend:

  1. @Page Theme attribútuma
  2. Web.config-ban <pages theme="themeName"/>
  3. Control helyben definiált attribútumai
  4. @Page StyleSheetTheme attribútuma
  5. Web.config-ban <pages styleSheetTheme="themeName"/>

Attól függően, hogy a Theme vagy a StyleSheetTheme attribútumnak adunk értéket, lehetőség van az .aspx kódban megváltoztatni a control tulajdonságait.

Alkalmazás téma létrehozása

  • Hozzunk létre egy App_Themes, könyvtárat, és azon belül egy másik könyvtárat a konkrét témának
  • Adjunk hozzá az alkönyvtárhoz .skin, .css és kép file-okat
  • Állítsuk be a Theme vagy a StyleSheetTheme attribútumot a web.configban, vagy az érintett oldalakon

Globális téma létrehozása

  • Local HTTP site: C:\Inetpub\wwwroot\aspnet_client\system_web_0_50727\Themes

könyvtár alkönyvtárába pakoljunk

  • Filerendszer alapú site: C:\Windows\Microsoft.NET\FrameWork\<version>\ASPNETClientFiles\Themes

könyvtár alkönyvtárába pakoljunk

Skinek: a controlok bizonyos megjelenésért felelős attribútumait definiálják felül

  • Default skin: nem rendelkezik SkinID-vel. Minden controlra érvényesül.
  • Named skin: a megfelelő SkinID-jú controlokra érvényesül csak.
  • A .skin file-on belüli control stílus definíciók kötelezően tartalmazzák a runat="server" és

nem tartalmazhatják az ID attribútumot.

    • Pl. <asp:Button runat="server" BackColor="Red" Font-Name="Arial" Font-Size="9px"/>

CSS

  • Solution Explorer-en Add New Item... / Style Sheet template

Témák cseréje

  • A Theme-et a Page_PreInit metódusban lehet megváltoztatni
    • Page.Theme = "..."
    • calendar1.SkinID = "..."
  • A StyleSheetTheme-et a StyleSheetTheme property felüldefiniálásával lehet megváltoztatni

Felhasználói profilok használata

A felhasználó személyes adatait, téma beállításait, stb. a profiljában tároljuk.

A profil tárolódhat adatbázisban. Ekkor az adatbázist ki kell egészíteni a szükséges táblákkal az aspnet_regsql -Ap paranccsal. Ha nincs authentikáció, a felhasználó azonosítása történhet hosszú lejáratú cookie vagy session azonosító segítségével is. Ehhez engedélyezni kell az anonim azonosítást:

<configuration>
	 <system.web>
		  <anonymousIdentification enabled="true" />
	 </system.web>
</configuration>

Ha a felhasználó időközben mégis bejelentkezik, új azonosítót kap, a régi profilját migrálni kell a Profile_OnMigrateAnonymous metódusban:

public void Profile_OnMigrateAnonymous(object sender, ProfileMigrateEventArgs args) {
	 ProfileCommon anonProfile = Profile.GetProfile(args.AnonymousId);
	 // attribútumok átírása
	 Profile.City = anonProfile.City;
	 // profil törlése
	 ProfileManager.DeleteProfile(args.AnonymousId);
	 // anonymous azonosító cookie törlése
	 AnonymousIdentificationModule.ClearAnonymousIdentifier();
}

Profil konfigurálása

  • Property-k felsorolása, az alapértelmezett típus a string
<configuration>
	 <system.web>
		  <profile>
				<properties>
					 <add name="FirstName" />
					 <add name="LastVisit" type="System.DateTime" />
				</properties>
		  </profile>
	 </system.web>
</configuration>
	  
  • Property-nként meghatározható, hogy bekerüljön-e az anonim profilba: allowAnonymous="true"
  • A property-k csoportosíthatók, és Profile.Address.Street formában elérhetők
<properties>
	 <group name="Address">
		  <add name="Street" />
		  <add name="City" />
	 </group>
</properties>
	  

Controlok dinamikus hozzáadása

  • Adjunk hozzá egy PlaceHolder-t az oldalhoz a kívánt bővítés helyén
  • A Page_Load metódusban hozzuk létre a controlt
  • Adjuk hozzá a PlaceHolder1.Controls.Add() metódussal

Web Part-ok használata

A web part-ok olyan komponensek, amit a felhasználó megjeleníthet, eltüntethet és mozgathat.

Lépések

  • Adjunk hozzá egy WebPartManager controlt az oldal tetejéhez
  • Hozzunk létre egy layout táblázatot a web part-oknak
  • Pakoljunk bele egy-egy WebPartZone-t minden cellába, és nevezzük el őket (Title)
  • Adjunk hozzá controlokat a zónákhoz és nevezzük el őket

Web Part nézetek (DisplayMode):

  • Browse: read-only nézet
  • Design: a felhasználók drag&drop segítségével mozgathatják a web partokat
  • Edit: a felhasználók mozgathatják a web partokat, és beállíthatják a megjelenésüket
    • Szükséges: AppearanceEditorPart és LayoutEditorPart hozzáadása egy EditorZone-ba
  • Catalog: új web partokat pakolhat föl az oldalra egy listából
    • Szükséges: CatalogZone hozzáadása
  • Connect: a felhasználó kapcsolatokat hozhat létre az egyes web partok között
    • Szükséges: ConnectionZone hozzáadása

Nézetek közti váltás

  • Hozzunk létre egy DropDownList-et, ami a lehetséges módokat tartalmazza
  • Hozzunk létre egy EditorZone-t, egy CatalogZone-t és egy ConnectionZone-t
  • Az EditorZone-ba tegyünk bele egy AppearanceEditorPart-ot és egy LayoutEditorPart-ot
  • Mód váltás: WebPartManager.GetCurrentWebPartManager(Page).DisplayMode = mód

Kapcsolatok definiálása a web partok között

  • Statikus kapcsolat: a fejlesztő hozza létre, a felhasználó nem törölheti.
    • Egy controlt vagy egy WebPart-ot ki kell egészíteni egy provider metódussal
[ConnectionProvider("User name provider", "NameProvider")]
public string GetName() {
	 return txtName.Text;
}
		  
    • Egy másik controlt vagy egy WebPart-ot ki kell egészíteni egy consumer metódussal
[ConnectionConsumer("User name provider", "NameProvider")]
public void GetName(string name) {
	 lblGreeting.Text = "Welcome, " + name;
}
		  
    • Tegyük bele a termelőt és a fogyasztót is egy zónába, pl. getName és showName ID-vel
    • A <WebPartManager> element belsejében definiáljuk a kapcsolatot
<asp:WebPartManager ID="WebPartManager1" runat="server">
	 <StaticConnections>
		  <asp:WebPartConnection
				ID="conn1"
				ProviderId="getName" ProviderConnectionPointId="NameProvider"
				ConsumerId="showName" ConsumerConnectionPointId="NameProvider" />
	 </StaticConnections>
</asp:WebPartManager>
		  
  • Dinamikus kapcsolat: a felhasználó hozza létre a ConnectionZone-ban
    • ConnectDisplayMode-ban lehet össze- és szétkapcsolni a controlokat
    • A web part menüjéből ki kell választani a Connect menüpontot
      • Felsorolja a létező kapcsolatokat, és felajánlja a szétkapcsolódást
      • Felsorolja a kompatibilis web partokat, és felajánlja az összekapcsolódást

Web part-ok perszonalizációja

  • A lementendő property-ket jelöljük meg [Personalizable] attribútummal
  • A bejelentkezett felhasználók számára alapból elérhető
  • Az alapbeállításokat ki írhatja felül
<authorization>
	<allow verbs="enterSharedScope" users="..." roles="admin" />
</authorization>
	  
  • A funkció kikapcsolható oldalanként
<asp:WebPartManager ID="WebPartManager1" runat="server">
	 <Personalization Enabled="false"/>
</asp:WebPartManager>
	  

Globalization and Accessibility

Website többnyelvűsítése

Lokális erőforrások: egy oldalra vonatkoznak

  • A weboldalhoz képest a .\App_LocalResources könyvtárban vannak
  • File neve = <oldal neve>[.nyelv].resx, pl. Default.aspx.en.resx
  • Default erőforrás file generálása: Tools / Generate Local Resource
    • Létrehozza az App_LocalResources könyvtárat, ha szükséges
    • Minden controlnak felsorolja a szöveges attribútumait (Title, Text, Tooltip)
    • A controlokban felvesz egy erőforrás hivatkozást:

<asp:Label ID="Label1" runat="server" meta:resourcekey="Label1Resource1" Text="Label" />

  • Az újonnan felvett controlok többnyelvűsítéséhez újból ki kell választani a

Generate Local Resource menüpontot

  • A többi nyelvhez másoljunk le egy létező resource file-t, és fordítsuk le a mezőit.
  • A megjelenített oldal nyelve a böngésző beállításaitól függ.

Globális erőforrások: akkor használjuk, ha ugyanazt az erőforrást akarjuk több weboldalról elérni.

  • A ~/App_GlobalResources könyvtárba kell helyezni az erőforrás file-okat
    • Solution Explorer / Add New Item... / Resource File
  • Erőforrás azonosítók hozzárendelése a controlok property-ihez: Expressions
    • Bindable Properties: melyik property értékét akarjuk megváltoztatni
    • Expression Type: Resources
    • ClassKey: az erőforrás file neve
    • ResourceKey: erőforrás azonosító
  • Hozzárendelés aspx-ből:

<<math> Resource: ClassKey, ResourceKey %>

  • Hozzárendelés C#-ból típusosan:

Label1.Text = Resources.ClassKey.ResourceKey;

  • Hozzárendelés C#-ból nem típusosan:

Image1.ImageUrl = (string)GetGlobalResourceObject("WebResourcesGlobal", "LogoUrl");
A GetLocalResourceObject() csak erőforrás azonosítót vár argumentumként, file nevet nem.

Nyelv beállítása kódból

  • Page.Culture: szám- és dátumformázás, pénznem. Csak specifikus (kéttagú) kultúra adható meg
  • Page.UICulture: milyen lokális és globális erőforrásokat töltsön be
  • Felülírás: felül kell definiálni az InitializeCulture() metódust
public override void InitializeCulture() {
	 if (Request.Form["DropDownList1"] != null)
		  UICulture = Culture = Request.Form["DropDownList1"];
}
	  
  • Támogatott kultúrák lekérdezése: CultureInfo.GetCultures()
    • Az CultureTypes argumentummal szűkíthető: AllCultures, NeutralCultures, SpecificCultures
  • Nyelv beállítása globálisan:

<globalization uiculture="es" culture="es-MX" />

  • Oldal nyelvének beállítása:

<%@ Page UICulture="es" Culture="es-MX" %>

Accessibility

Cél: csökkent képességű emberek is tudják használni a website-unkat. W3C ajánlás: WCAG (Web Content Accessibility Guidelines).

  • Állítsuk be minden kép AlternateText-jét és opcionálisan a DescriptionUrl-jét

Képernyőolvasók számára plusz infók is elhelyezhetők egy láthatatlan képhez csatolt szövegben.

  • Használjunk kontrasztos színeket
  • Használjunk olyan layoutot, ami jól tűri a szövegek átméretezését
  • Adjunk rövid leírást a táblázatokhoz a Caption property segítségével
  • Különítsük el a táblázatban az oszlop fejléceket
  • Ne használjunk fix font méretet
  • Az oldal legyen használható JavaScript nélkül is
  • Ha az oldal nem tehető könnyen accessible-lé, hozzunk létre belőle szöveges változatot.

Formok felhasználóbarátabbá tétele

  • Állítsuk be a fókuszt az első beviteli mezőre
  • Állítsuk logikus sorrendbe a tab ordert
  • Állítsuk be a DefaultButton property-t
  • A linkek szövege önmagában is legyen értelmezhető
  • Állítsunk be AccessKey-eket a navigáció felgyorsítása érdekében
    • Ehhez minden <input> control elé tegyünk egy AccessKey attribútummal ellátott Label-t
  • A formot tagoljuk panelekre, és adjunk a szakaszoknak címet (Panel.GroupingText)
  • A Validator-oknak állítsunk be érthető szöveget és hibaüzenetet

Accessibility szabályok ellenőrzése

  • Solution Explorer-ben a site nevén jobb gomb és válasszuk ki a Property Pages menüpontot
  • Az Accessibility fülön állítsuk be, hogy milyen tulajdonságokat szeretnénk ellenőriztetni
  • A Build fülön engedélyezzük a validációt az oldalakra és a site-ra is
  • Fordításkor felsorolja a hibákat

(eltéréseket a WCAG Priority 1, WCAG Priority 2, Access Board Section 508 ajánlásokhoz képest)

Implementing Authentication and Authorization

Membership használata

Login controlok

  • Login: bejelentkezés. Együttműködik az ASP.NET Membership-pel,

de használható egyedi azonosításhoz is az Authenticate esemény lekezelésével.

  • LoginView: különböző nézet hozható létre a bejelentkezett felhasználónak
  • LoginStatus: logout link a bejelentkezett felhasználóknak, login link a többieknek
  • PasswordRecovery: elfelejtett jelszó újragenerálása és elküldése egy adott email címre
  • CreateUserWizard: felhasználó regisztrálciója
  • ChangePassword: jelszó változtatás

Membership: felhasználók kezelése

  • CreateUser()
  • DeleteUser()
  • FindUsersByName(), FindUsersByEmail(), GetUserNameByEmail(): keresés
  • GeneratePassord()
  • GetAllUsers()
  • GetNumberOfUsersOnline()
  • GetUser(): bejelentkezett felhasználó
  • UpdateUser()
  • ValidateUser(): felhasználónév és jelszó ellenőrzése

Roles: szerepek kezelése

  • AddUser[s]ToRole[s]()
  • CreateRole()
  • DeleteRole()
  • FindUsersInRole()
  • GetAllRoles(), GetRolesForUser()
  • IsUserInRole()
  • RemoveUser[s]FromRole[s]()

Authentikáció konfigurálása

  • Web Site Administration Tool Security fülén
  • Membership konfigurációja (internet/intranet)
  • Szerepek létrehozása
  • Felhasználók létrehozása és szerepekhez rendelése
  • Access Rule-ok létrehozása (melyik konyvtárhoz milyen szereppel lehet hozzáférni)
  • SMTP szerver beállítása
  • Login oldal létrehozása: ~/Login.aspx-re konfiguráció nélkül átirányít
    • Login control
    • ValidationSummary, ha kellenek a hibaüzenetek
    • Opcionálisan PasswordRecovery control
  • Helyezzünk el egy LoginStatus controlt minden oldalon
  • Érvénytelen bejelentkezési kísérletek logolása
    • Login.LoginError esemény
    • PasswordRecovery.UserLookupError
    • PasswordRecovery.AnswerLookupError

Felhasználó regisztrálása

  • CreateUserWizard controllal
  • A regisztráció végén a ContinueButtonClick eseménnyel irányítsuk át, pl.

Response.Redirect("Member/Default.aspx");

  • CreatedUser eseményben adjunk neki szerepeket

Roles.AddUserToRole("felhasználónév", "szerep")

Authentikációs módok

Windowsos authentikáció

  • Az IE továbbítja a WindowsIdentity-t az intranet portálnak, nem kell jelszót beírni
  • IIS Authentication Method ablakánan az Enable Anonymous Access-t kikapcsolni,

és az Integrated Windows Authentication-t bekapcsolni

  • Beállítható a web.config-ban is (legalább az egyikben kötelező)
<configuration>
	 <system.web>
		  <authentication mode="Windows"/>
		  <authorization>
				<deny users="?"/>
		  </authorization>
	 </system.web>
</configuration>
	  

Forms authentikáció

Cookie-ban vagy URL-ben tárolja az authentiációs tokent. Ellenőrzi, hogy a böngésző támogatja-e a cookie-kat, és ha igen, azt használja. AutoDetect=true beállítással azt is ellenőrzi, hogy be vannak-e kapcsolva.

A böngésző által adott popup form felülírható sajáttal:

<configuration>
	 <system.web>
		  <authentication mode="Forms">
				<forms loginURL="LoginForm.aspx"/>
		  </authentication>
		  <authorization>
				<deny users="?"/>
		  </authorization>
	 </system.web>
</configuration>
	  

TODO: részletezni

Accountok megadása a Web.Config-ban

	...

Passport authentikáció

TODO: részletezni

Authentikáció kikapcsolása, ha nem használjuk

<authentication mode="None"/>

Access rule-ok definiálása web.config-ból

  • <authorization> szakasz
  • Alapbeállítás machine.config-ban: <allow users="*"/>
  • Felülírható <allow> és <deny> tagekkel
    • users attribútum: milyen felhasználókra vontakozzon
    • roles attribútum: milyen szerepkörökre vontakozzon
    • "gépnév\" előtaggal hivatkozhatunk windowsos felhasználókra és szerepekre
  • A gyerek könyvtár örökli a szülő beállításait

Creating ASP.NET Mobile Web Applications

A mobil alkalmazás ugyanúgy egy code behind-dal rendelkező .aspx file. A különbség, hogy asp: előtagú controlok helyett mobile: controlokat kell használni.

Mobil alkalmazás tesztelése

  • Hagyományos böngészőnek sima HTML generálódik ↔ IE-vel is nézhető
  • OpenWave szimulátorral
  • Visual Studio-val települtő Device Emulatorral. Pocket PC mellett mobilt is emulál.

Parancssorból lehet indítani.

Mobil alkalmazás tulajdonságai

  • A mobile:form MultiView egy View-jának felel meg, tipikusan sok van belőle egy oldalon
  • A legtöbbször 1 aspx oldalra van bezsúfolva minden tartalom, kivéve, ha túl nagyra nő,

vagy linkelni kell valamelyik belső oldalra

  • A mobilok ritkán támogatják a cookie-kat ↔ cookileless session-t kell használni.

A session ID az URL-be ágyadózik be.
<sessionState cookiless="true"/>

  • Lapozás: akkor érdemes bekapcsolni, ha hosszú read-only tartalom van egy oldalon.
  • Panelek: controlok csoportosítására, együttes elrejtésére és dinamikus hozzáadására használható,

navigációra nem alkalmas.

  • Stílusok: StyleSheet controllal vagy <Style> taggel módosíthatók.

Egy formra csak egy StyleSheet kerülhet. Ha az eszköz nem támogat egy stílust, figyelmen kívül hagyja. A control örökli a konténer stílusát.

  • Adaptív renderelés: a control a böngészőtől függően másképp jelenik meg,

pl. a naptár több oldalra tördelődik.

A böngésző képességei a Request.Browser property-n keresztül érhetők el. A böngészők leírása .browser file-okban találhatók a C:\Windows\Microsoft.NET\Framework\v2.0.50727\CONFIG\Browsers könyvtárban. Váltaztatás után újra kell generálni az ASP.BrowserCapsFactory osztályt: aspnet_regbrowsers -i.

Adaptív renderelés:

  • Page_Load-ban: if (Request.Browser.IsMobileDevice) { ... } else { ... }
  • DeviceSpecific control használata, a PropertyOverrides property-jét kell bekapcsolni
    • web.config-ban <deviceFilters> alá kell <filter>-eket berakni
    • vagy az ApplyDeviceFilters-ben definiálni a mobil nézetet
    • A designerben minden filterhez külön beállíthatók a controlok property-i.

Mobil controlok

  • mobile.Form belsejébe kell rakni őket
  • Nem használhatók standard controlok
  • Némely controlból korlátos számú kerülhet egy oldalra
  • Load, Prerender és Unload eseményekkel rendelkeznek

Label

  • Rövid statikus szövegek megjelenítésére alkalmas
  • Alignment és Wrapping állítható

HyperLink

  • Oldalak és formok között lehet vele ugrálni
  • A form nevét # után kell megadni

TextBox

  • Szöveg bevitelére használható
  • Size: szélesség
  • MaxLength: input maximális hossza
  • Numeric=true: csak számokat fogad el
  • Password=true: kicsillagozza a karaktereket

TextView

  • Hosszú szövegek megjelenítésére alkalmas
  • Belül használhatók az <a>, <b>, <br>, <i> és <p> html tagek

Command

  • Egyes készülékeken gombként, másokon gyorsbillentyűként jelenik meg
  • Text: a gomb szövege

Image

  • Kép megjelenítése
  • Készülékenként megjeleníthető más kép
  • AlternateText: helyettesítő szöveg, ha az eszköz nem támogatja a képformátumot

List

  • Statikus link lista megjelenítése, elem kiválasztásakor postbackel
  • Szükség esetén lapozható
  • Items: a lista elemei
  • DataSource, DataMember, DataTextField, DataValueField: adatkötés beállítására

SelectionList

  • Olyan, mint a sima lista, csak nem postbackel
  • Alapból DropDownList-ként renderelődik
  • Több elem is kiválasztható ha SelectType=MultiSelectListBox vagy CheckBox
  • List-hez hasonlóad támogatja az adatkötést

ObjectList

  • DataGrid mobil változata
  • Megjeleníti a LabelField által kijelölt oszlopot (alapból az elsődleges kulcsot),

az egyiket kiválasztva részletezi a rekordot

Calendar

  • Dátum kiválasztására használják
  • A felhasználó is begépelheti a dátumot
  • Készülékenként jelentősen megváltozhat a kinézete

AdRotator

  • A hagyományos AdRotator-ral megegyezik a működése
  • XML-ben konfigurálhatók a reklámok
  • Alternatív banner definiálható a <MobileImageUrl> tagen belül

PhoneCall

  • Olyan link, ami telefonhívást indít
  • PhoneNumber: a tárcsázandó szám
  • Text: a link szövege. Ha nincs megadva, a PhoneNumber-t használja szövegnek.
  • SoftKeyLabel
  • AlternateText: mit írjon ki, ha a készülék nem támogatja a szám hívását
    • A {0} helyére a Text-et, az {1} helyére a PhoneNumber-t helyettesíti be

Validáció

  • Minden validátornak és a ValidationSummary-nek van mobil változata is
  • Nincs kliens oldali validáció

Adatkötés

  • DataSource, DataMember, DataTextField, DataValueField beállításával
  • Kérdezzük le az IsPostBack-et
  • Adatokat cache-eljük
  • Csak az aktuális formra hajtsuk végre az adatkötést

Jótanácsok

  • Legyen külön mobil és desktop nézete az oldalainknak
  • A tartalom legyen minél tömöbrebb
  • Csak a szükséges rekordot jelenítsük meg
  • Teszteljünk különböző eszközökkel
  • Egyszerűsítsük az adatbevitelt default értékekkel, ahol lehet
  • ViewState-et kapcsoljuk ki
  • Használjunk cache-t
  • Oldalon belüli formok között egyszerűbb adatot cserélni, mint oldalak között
  • Használjunk cookie nélküli session-t
  • Kevés képet használjunk

Monitoring, Deploying, and Caching Applications

Web alkalmazás telepítése

  • File alapú site-okat nagyon egyszerű telepíteni és frissíteni, egyszerűen csak be kell másolni

a file-okat a megfelelő helyre. Frissítéskor sem kell újraindítani a webszervert.

  • Ha az IIS beállításokat is szeretnénk migrálni egy távoli gépre, létre kell hozni egy Web Setup Projectet
Web Setup Project
  • Létező projekt típus a Visual Studioban
  • Kézzel kell fordítani, generál egy setup.exe-t és egy .msi-t a solution könyvtárába
    • Az .msi telepítő egységes módon paraméterezhető parancssorból

Telepítő beállításai

  • Search Target Machine: hova települjön, alapból IIS-t keres.
    • FileName: megadhatók a futtatáshoz szükséges dll file-ok
    • Folder, Depth: hol és milyen mélyen keressen
    • MinDate, MaxDate, MinSize, MaxSize, MinVersion, MaxVersion: egyéb keresési kritériumok
    • Property: találatok lekérdezése
  • Launch Conditions: milyen verziójú Windows és IIS kell a futtatáshoz
    • Condition: futás szükséges feltételei
      • Szűrési feltételek: VersionNT, Version9x, ServicePackLevel, WindowsBuild, SystemLanguageID,

AdminUser, PhysicalMemory, IISVERSION

      • Pl. IISVERSION = "#6" AND VersionNT >= 500 (Win2k)
      • Használható boolean operátorok: Not, And, Or, Xor, Eqv, Imp
    • InstallUrl: ha hiányzik egy feltétel, ide navigál
    • Message: ha hiányzik egy feltétel, ezt írja ki
  • Egyéni varázsló oldalak: licensz, web.config beállítása, stb.

Elkülöníthetők a sima és az adminisztratív jellegű oldalak.

    • Add dialog, válasszunk ki egy template-et, állítsuk be a property-ket

Egyedi akciók hozzáadása

  • Add Custom Action (típusai: Install, Commit, Rollback, Uninstall)
  • Rendeljük hozzá a kódot

Registry használata

  • View / Editor / Registry
  • Add...
  • DeleteAtUninstall=true
Copy Web Tool

Telepítés a Copy Web Tool-lal

  • Négyféle projekt típus (File System, Local IIS, FTP Site, Remote Site) között képes konvertálni és szinkronizálni.
  • Szinkronizációkor megmutatja, hol vannak verzió ütközések.
Publish Web Site Tool

Web alkalmazás előfordítása

  • Előre, nem csak on-demand módon lefordítja a weboldalakat, csökkentve a késleletést az első

letöltéskor

  • Parancssorból: aspnet_compiler.exe
  • A site lefordítható egy file-ba vagy oldalanként külön file-okba

Web alkalmazás monitorozása

Logolható

  • Alkalmazás indítása és leállítása
  • Sikeres és sikertelen bejelentkezési kísérletek
  • ASP.NET hibák
  • Egyéni alkalmazás események

A logolás helyét a provider határozza meg. Az EventLogWebEventProvider-en kívül alapból egyik provider sincs semmilyen eseményre feliratkozva.

  • EventLogWebEventProvider: windowsos event logba ír (alapból az ASP hibákat és a sikertelen bejelentkezési kísérleteket logolja). A Windows Event Viewer-rel nézhető meg a log tartalma.
  • SqlWebEventProvider: MSSQL adatbázisba logol.
  • WmiWebEventProvider: az eseményeket WMI eseményekké konvertálja.
  • SimpleMailWebEventProvider, TemplateMailWebEventProvider: e-mailt küld az eseményekről.
  • TraceWebEventProvider: a Trace-be logol.
  • WebEventProvider leszármaztatásával saját provider is írható.

Esemény típusok

  • WebApplicationLifetimeEvent: alkalmazás indítása és leállítása
  • WebAuthentication{Failure|Success}AuditEvent: sikertelen/sikeres bejelentkezés
  • WebErrorEvent: hibák
  • WebHeartBeatEvent
  • WebRequestErrorEvent

Események beállítása web.config-ban

  • healthMonitoring / bufferModes / add: heartbeat, flush gyakorisága, ...
  • healthMonitoring / providers / add: log helye
  • healthMonitoring / profiles / add: legfeljebb milyen gyakorisággal logoljon egy adott eseménytípust
  • healthMonitoring / rules / add: eseménytípusok és providerek összerendelése
  • healthMonitoring / eventMapping / add: saját esemény beregisztrálása valamelyik kategóriába

Performance counterek használata

  • Designer támoatás a Server Explorer ablakban
  • Saját counter és kategória is regisztrálható (pl. eladások száma)
  • Létrehozás: PerformanceCounterCategory.Create(CounterCreationDataCollection)

bővebben ld. 70-536

Gyorsítótárazás

Application caching: globális cache objektumban tárolhatók adatok idő- és tárlimittel.

  • Cache["kulcs"] = érték. Lekérdezéskor, ha a kulcs nem létezik, null-lal tér vissza.
  • Cache.Insert() argumentumai
    • kulcs
    • érték
    • függőség: ha a szülő megszűnik, szűnjön meg ő is
    • abszolút vagy relatív lejárati idő
    • prioritás: a cache megtelésekor az alacsony prioritású elemeket dobja el
    • callback eldobás esetén

Page output caching: weboldalak gyorsítótárazása

  • Az @OutputCache direktívával konfigurálható
    • Duration: hány másodpercig maradjon bent (kötelező)
    • Location: kliensen és/vagy szerveren cache-eljen
    • NoStore: csak a memóriában maradjon
    • VaryByParam: a megadott post-olt attribútumok függvényében külön változatokat tárol.

Alapérték: "none"

    • VaryByControl: control állapotától függően külön változatokat tárol
    • VaryByHeader: HTTP header alapján külön változatokat tárol
  • Response.Cache beállításával kódból
    • SetExpires ~ Duration
    • SetCacheability ~ Location
    • SetValidUntilExpires: ne lehessen időközben HTTP headerrel kikapcsolni
  • Response.WriteSubstitution(): cache-elt oldal részleges megváltoztatása
  • Substitution control: nem cache-elt Label
  • ValidatePage() metódus metódusban eldönthető, hogy az aktuális oldal változat érvényes-e
    • HttpValidationStatus.Valid: érvényes
    • HttpValidationStatus.IgnoreThisRequest: érvényes, de egyszeri alkalommal újragenerálja
    • HttpValidationStatus.Invalid: nem érvényes

Globálisan konfigurálható a cache a web.config-ban

  • caching / outputCacheSettings / outputCacheProfiles / add
  • <%@ OutputCache CacheProfile="..." VaryByParam="none" %>

-- Peti - 2007.07.09.


%META:FORM{name="ValaszthatoForm"}% %META:FIELD{name="Trgy" title="Tárgy" value=".NET Framework 2.0 Web-Based Client Development"}% %META:FIELD{name="Trgykd" title="Tárgykód" value="70-528"}% %META:FIELD{name="Tanszk" title="Tanszék" value="Microsoft"}% %META:FIELD{name="Elad" title="Előadó" value=""}% %META:FIELD{name="Kreditszm" title="Kreditszám" value="0"}% %META:FIELD{name="raszm" title="Óraszám" value="5x4"}% %META:FIELD{name="Flv" title="Félév" value="tavaszi"}% %META:FIELD{name="Terlet" title="Terület" value="Programozás"}% %META:FIELD{name="raijelenlt" title="Órai jelenlét" value="kötelező"}% %META:FIELD{name="Jegy" title="Jegy" value="vizsga "}% %META:FIELD{name="Elvrtmin.munka" title="Elvárt min. munka" value="bejárás"}% %META:FIELD{name="Minimumrajrjegy" title="Minimumra járó jegy" value="-"}% %META:FIELD{name="Elvrtmax.munka" title="Elvárt max. munka" value="könyv elolvasása - nagy meló"}% %META:FIELD{name="Munkrajrjegy" title="Munkára járó jegy" value="MCP vizsga kupon"}%