[ASP].NET Worst Practices

Podobné dokumenty
[ASP].NET Worst Practices

Robert Haken [MVP ASP.NET/IIS, MCT] software architect, HAVIT, Perly code-review z praxe

Code Contracts. Robert Haken [MVP ASP.NET, MCT] Software architect, Owner at HAVIT, s.r.o. knowledge-base.havit.cz

Základy jazyka C# Obsah přednášky. Architektura.NET Historie Vlastnosti jazyka C# Datové typy Příkazy Prostory jmen Třídy, rozhraní

Příklad aplikace Klient/Server s Boss/Worker modelem (informativní)

Univerzita Palackého v Olomouci Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 3.4.

Zápis programu v jazyce C#

Jazyk C# - přístup k datům

Univerzita Palackého v Olomouci Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 19.2.

Typický prvek kolekce pro české řazení

1. Téma 12 - Textové soubory a výjimky

PREPROCESOR POKRAČOVÁNÍ

Čipové karty Lekařská informatika

IW5 - Programování v.net a C# 4 Pokročilé konstrukce C#

Vláknové programování část V

Dědičnost (inheritance)

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat.

Tabulková data. budeme pracovat s CSV soubory položky oddělené středníkem, např.

KTE / ZPE Informační technologie

Jazyk C# (seminář 6)

Jazyk C# (seminář 3)

Jazyk C# - přístup k datům

RMI Remote Method Invocation

Teoretické minimum z PJV

Tomáš Herceg. Microsoft Student Partner Microsoft Most Valuable Professional

Indexové seznamy. známe už pole, kde ale musí být předem známa velikost indexové seznamy umí růst dynamicky

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

IRAE 07/08 Přednáška č. 2. atr1 atr2. atr1 atr2 -33

PŘETĚŽOVÁNÍ OPERÁTORŮ

Algoritmizace a programování

NIO. Aplikační programování v Javě (BI-APJ) - 12 Ing. Jiří Daněček Katedra softwarového inženýrství Fakulta informačních technologií ČVUT Praha

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

Distribuované systémy a výpočty

Ing. Bc. Robert Haken [MVP ASP.NET/IIS, MCT] software architect, HAVIT, Návrh schématu DB

5 Rekurze a zásobník. Rekurzivní volání metody

Statické proměnné a metody. Tomáš Pitner, upravil Marek Šabo

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Jazyk C# (seminář 5)

ADT/ADS = abstraktní datové typy / struktury

Návrh softwarových systém. Návrh softwarových systémů

Univerzita Palackého v Olomouci Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 10.4.

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Kolekce, cyklus foreach

Osnova přednášky. Programové prostředky řízení Úvod do C# II. Přístup ke členům. Členy (Members)

Ošetřování chyb v programech

ASP.NET Web API. Tomáš Herceg Microsoft MVP (ASP.NET)

ISZR Referenční agent.net

Příkazy a řídicí struktury v Javě. Tomáš Pitner, upravil Marek Šabo

20. Projekt Domácí mediotéka

STŘEDNÍ ŠKOLA PRŮMYSLOVÁ, TECHNICKÁ A AUTOMOBILNÍ JIHLAVA MATURITNÍ PRÁCE

Principy objektově orientovaného programování

Tvorba informačních systémů

Jazyk C# a platforma.net

Fakulta elektrotechniky a informatiky Univerzita Pardubice 2014/2015. poslední přednáška a materiál k samostudiu

Class loader. každá třída (java.lang.class) obsahuje referenci na svůj class loader. Implementace class loaderu

Počítačové laboratoře bez tajemství aneb naučme se učit algoritmizaci a programování s využitím robotů CZ.1.07/1.3.12/

Generické programování

Robert Haken [MVP ASP.NET/IIS, MCT] software architect, HAVIT, Optimalizace výkonu webových aplikací

Objekt. základní prvek v OOP. má vlastnosti. má metody. vznikne vytvoření nové instance definován pomocí třídy

Seznamy a iterátory. Kolekce obecně. Rozhraní kolekce. Procházení kolekcí

PB161 Programování v jazyce C++ Přednáška 8

Seminář z IVT Algoritmizace. Slovanské gymnázium Olomouc Tomáš Kühr

Java a Caché IV: Manipulace s objekty

Pro kontrolu správného formátu hodnoty N použijeme metodu try-catch.

Stromy. Příklady. Rekurzivní datové struktury. Základní pojmy

Objekty jako zapozdření dat. začneme vytvářet vlastní objekty a třídy

Vytváření a použití knihoven tříd

Kapitola 5 WCF, webové služby a mezidoménové zásady

Robert Haken [MVP ASP.NET/IIS, MCT] software architect, HAVIT, Základní algoritmy v praxi

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

SOUBORY, VSTUPY A VÝSTUPY

Otázky k teoretické části zkoušky z předmětu IAJCE 2006/2007

Jazyk C# - přístup k datům

Projekty pro výuku programování v jazyce Java

Výjimky. v C# a Javě

Fronta (Queue) Úvod do programování. Fronta implementace. Fronta implementace pomocí pole 1/4. Fronta implementace pomocí pole 3/4

8. přednáška: Soubory a proudy

Soubor jako posloupnost bytů

17. Projekt Trojúhelníky

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat.

Programování jako nástroj porozumění matematice (seriál pro web modernivyuka.cz)

Třídy a objekty. Třídy a objekty. Vytvoření instance třídy. Přístup k atributům a metodám objektu. $z = new Zlomek(3, 5);

Distribuované systémy a výpočty

Textové soubory. alg9 1

Práce s textem. Třída Character. Třída Character. Třída Character. reprezentuje objekty zapouzdřující hodnotu typu char (boxing / unboxing)

Abstraktní datové typy: zásobník

CMS LARS VIVO VERZE 1.2 Z POHLEDU VIVOJÁŘE

Java - výjimky. private void vstup() throws IOException {... }

Středoškolská technika 2017 PROGRAM NA GENEROVÁNÍ PRVOČÍSEL

ISZR Referenční agent.net

Základní pojmy. Matice(řádky, sloupce) Matice(4,6) sloupce

Car Agent. Struktura chování:

Přehled probírané látky

Tvorba informačních systémů

Regulární výrazy. Vzory

Používáme pole a kolekce

<surface name="pozadi" file="obrazky/pozadi/pozadi.png"/> ****************************************************************************

Univerzita Palackého v Olomouci Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 26.3.

Jazyk C# a platforma.net

Úvod Třídy Rozhraní Pole Konec. Programování v C# Hodnotové datové typy, řídící struktury. Petr Vaněček 1 / 39

Transkript:

Robert Haken [MVP ASP.NET/IIS, MCT] software architect, HAVIT, s.r.o. haken@havit.cz, @RobertHaken, http://knowledge-base.havit.cz [ASP].NET Worst Practices

SecurityLog

Finalizers vs. Garbage Collection DEMO

ResourceManager.cs: private readonly ResourceItem[] items; public string GetResourceString(string key, CultureInfo culture) return items. Where(x => x.equals(new ResourceItem(key, culture))). Select(x => x.text). FirstOrDefault(); ResourceItem.cs public bool Equals(ResourceItem other) if (object.referenceequals(other, null)) return false; return (Key.Equals(other.Key) && LCID.Equals(other.LCID));

<compilation debug="true" /> Optimizecode= false batchcompilation = false no request timeout vypínání cachováníwebresources.axd, ScriptResource.axd,... aktivuje debugging-friendlyspecifika unminifiedverze JScriptů, CSS,... #if DEBUGkód větší spotřeba paměti

<deployment retail="true false"/> machine.config/configuration/system.web machine-wide málo známé, málo používané, málo dokumentované nastavuje debug="false" vypíná výstup do trace vypíná podrobné chyby pro remoteclienty(customerrors)

PerformanceTuning DEMO

private readonly Dictionary<string, string> localizedurls; private string GetUrl(string lang) if (localizedurls.containskey(lang)) return localizedurls[lang]; return "/"; private string GetUrl(string lang) if (localizedurls.trygetvalue(lang, out string url)) return url; return "/"; Proč hledat dvakrát?

Sessions DEMO

ASP.NET Overposting / Mass Assignment DEMO

Foreign Code Execution (Upload) DEMO

Bug-onlyvýjimky nezachytávejte try DoSomething(); catch (NotImplementedException) // should not happen very often NullReferenceException InvalidOperationException ArgumentException ArgumentNullException...

Re-inventingwheel public static Exception SendAlert(string subject, string body) Exception exceptionout = null; try MailMessage message = new MailMessage(); //... catch (Exception exception) exceptionout = exception; return exceptionout; var ex = SendAlert(subject, body); if (ex!= null) //?? catch (ex) Log(ex);

Kategorie WTF?!

lock(new object()) // thread-safe...vygůgliljsem, že stačí lockna newobject private [static] object mylock = new object(); lock(mylock)...

[Flags] public enum TreeNodeType Normal, Linked, Locked if (t.hasflag(treenodetype.normal)) // WTF? always true! [Flags] vždy s hodnotami, jinak je Normal= 0, Linked= 1, Locked= 2,... [Flags] public enum TreeNodeType Normal = 1, Linked = 2, Locked = 4 // 8, 16,...

Task: Importuj jen druhy 2, 4 a 5 int[] nenacitanedruhy = new int[] 1, 3, 6, 7, 8, 9, 10, 11, 13, 14, 15, 16, 17, 18, 19, 50, 51, 52, 53, 54 ; if (!nenacitanedruhy.contains(druhzakazky)) // importuj Pozitivní přístup!

DataSet dsresult = new DataSet(); SqlDataAdapter mydataadapter = new SqlDataAdapter( "SELECT COUNT(*) FROM Uzivatel", "**ConnString**"); mydataadapter.fill(dsresult); string count = dsresult.tables[0].rows[0][0].tostring(); dsresult = null; Umím DataSety, tak je používám int count2 = (int)cmd.executescalar();

query.dateto = DateTime.Today.Date;...pro jistotu. // DateTime class public static DateTime Today get return Now.Date;

Process Crash DEMO

Code-reviewReq: "Streamvrácený metodou GetMemoryStreamnení disposován" Oprava:...doplněn using

private void Page_Load() // graf s počty přihlášení po dnech za dané období IEnumerable<DateTime> data = LoginLogService.GetListChartLoginLog( DateTime dt = frompicker.selectedvalue; frompicker.selecteddate, topicker.selecteddate); List<LoginStatistic> list = new List<LoginStatistic>(); while (dt <= DateTime.Today) list.add(new LoginStatistic Date = dt, Count = data.where(x => x.date == dt).count() ); dt = dt.adddays(1); MyChart.DataSource = list; MyChart.DataBind(); Výkonová optimalizace! Stačí, když to spočítám do dneška, v budoucnu žádná data přihlášení nejsou.

var posledniradekprojekt = Faktura.Items.Last(o => o.poradi == Faktura.Items.Max(v => v.poradi)).projekt; Poslední z posledních?.last(predicate) // odpovídá.where(predicate).last()

WebForms ViewState DEMO

// Kontrola vyplnění RČ a IČ dle právní formy if (akce.dotaceprijemcepravniformatyp == 1) chybaakce = "Pro typ '1' musí být zadáno RČ a nesmí být vyplněno IČ!"; if (akce.dotaceprijemcepravniformatyp == 2) chybaakce = "Pro typ '2' musí být alespoň jedna z položek RČ a IČ vyplněna!"; if (akce.dotaceprijemcepravniformatyp == 3) chybaakce = "Pro typ '3' musí být zadáno IČ a nesmí být vyplněno RČ!"; public enum PravniForma Nepodnikatel = 1, Zivnostnik = 2, PravnickaOsoba = 3 MagicNumbersNEEE! switch (akce.dotaceprijemcepravniformatyp) case PravniForma.Soukromnik: chybaakce = "..."; break; case PravniForma.Zivnostnik: chybaakce = "..."; break; case PravniForma.PravnickaOsoba: chybaakce = "..."; break;

private void GetListForMonth(SqlConnection sqlconnection, int month, int year, Dictionary<string, bool> list) list.clear(); //... while (sqldatareader.read()) list.add(sqldatareader[0].tostring(), true); //... var list = GetListForMonth(conn, 10, 2014, var list = new List<string>(); GetListForMonth(conn, 10, 2014, list);

http://knowledge-base.havit.cz Q & A