Tag Archives: IIS

50 teljesítmény tipp ASP.NET webalkalmazásokhoz

A fejlesztői segédeszközeiről híres RedGate kiadott egy ingyenes, 50 oldalas e-bookot 50 ways to avoid, find and fix ASP.NET performance issues címmel. A könyvben MVP-k SQL Server, ORM, .NET Framework, IIS és ASP.NET tippjeit gyűjtötték össze, melyek alkalmazásával jobb teljesítményt facsarhatunk ki a webalkalmazásainkból.

A könyv 50 javaslatot tartalmaz 50 oldalon, ebből talán már látszik, hogy nem az a célja, hogy minden technikai részlettel megismertesse az olvasót, hanem hogy felhívja a figyelmet olyan beállításokra vagy mintákra, amelyek mellett hajlamosak vagyunk nap mint nap elmenni. Ennek megfelelően a könyvben kevés újdonság van azok számára, akik már foglalkoztak ASP.NET teljesítmény tuningolással, számukra az igazi érték, hogy szinte ellenőrző listaként használható a könyv. Aki számára pedig új ez a terület, annak jó kiinduló pontot adhatnak a könyvben található témakörök és kulcsszavak a további tájékozódáshoz.

A könyv letölthető innen: http://www.red-gate.com/50ways

 

Technorati-címkék: ,,,,,
Advertisements

WCF szolgáltatás publikálása IIS 8-on

Egy alapbeállításokkal telepített IIS 8-on nem működnek a WCF szolgáltatások, mégpedig azért, mert a webszerver nem tudja, hogyan kell kezelnie az .svc kiterjesztésre érkező kéréseket. Két lépésben taníthatjuk meg neki:

 

1. Vegyünk fel egy új MIME type-ot:

Extension: .svc
MIME type: application/octet-stream

iis8-svc-mime-type

 

2. Vegyünk fel egy Managed HTTP Handlert:

Request path: *.svc
Type: System.ServiceModel.Activation.HttpHandler
Name: svc-Integrated

iis8-svc-handler

És már működik is!

 

Technorati-címkék: ,,

HTML5 MIME típusok IIS 8-on

Ha IIS 7/7.5 alatt olyan alkalmazást futtattunk, amely intenzíven használt HTML5-közeli fájl típusokat, akkor bizony a hozzájuk tartozó kiterjesztéseket fel kellett vennünk az IIS MIME Types listájába, különben a webkiszolgáló nem volt hajlandó kiszolgálni az ilyen fájlokra érkező kéréseket. Például így:

<staticContent>
  <mimeMap fileExtension=".mp4" mimeType="video/mp4" />
  <mimeMap fileExtension=".m4v" mimeType="video/m4v" />
  <mimeMap fileExtension=".ogg" mimeType="video/ogg" />
  <mimeMap fileExtension=".ogv" mimeType="video/ogg" />
  <mimeMap fileExtension=".webm" mimeType="video/webm" />
  <mimeMap fileExtension=".oga" mimeType="audio/ogg" />
  <mimeMap fileExtension=".spx" mimeType="audio/ogg" />
  <mimeMap fileExtension=".svg" mimeType="image/svg+xml" />
  <mimeMap fileExtension=".svgz" mimeType="image/svg+xml" />
  <remove fileExtension=".eot" />
  <mimeMap fileExtension=".eot" mimeType="application/vnd.ms-fontobject" />
  <mimeMap fileExtension=".otf" mimeType="font/otf" />
  <mimeMap fileExtension=".woff" mimeType="font/x-woff" />
</staticContent>

Ez szép és jó, de sajnos amikor frissítjük a szervert IIS 8-ra, akkor az IIS egy gyönyörű 500.19 Internal Server Error hibával fog megörvendeztetni minket.

iis8-duplicate-mime-type

Ha bekapcsoljuk a részletes hibaüzenet megjelenítését, akkor láthatjuk, hogy a hiba:

Cannot add duplicate collection entry of type ‘mimeMap’ with unique key attribute ‘fileExtension’ set to ‘.4v’

Mindez annak köszönhető, hogy az IIS 8 már több MIME típust ismer, ráadásul ezek szerver szinten vannak beállítva, így minden website örökli őket.

A megoldás természetesen az, hogy a saját web.configunkból töröljük a problémás sorokat. Nálam ezek váltak feleslegessé:

mp4, m4v, m4a, ogv, oga, ogg, webm, spx, svg, svgz, otf, woff

Ne felejtsétek el frissíteni a telepítőket!

 

Technorati-címkék: ,,

Gyakori PowerShell kérdések

Nem írok sűrűn PowerShell szkripteket, ezért van néhány olyan probléma, amibe gyakran belefutok. Íme a megoldásuk, hátha más is hasznát veszi:

Kommentezés

# Egysoros komment kettőskereszt után
<#
  Ez egy
  több soron 
  átnyúló megjegyzés
#>

Leírás

A Get-Help cmdlet által kiírandó leírás tartalmát a szkript elejére tett komment blokkban adhatjuk meg az alábbi formában:

<#
.SYNOPSIS
    Rövid leírás...    
.DESCRIPTION
    Hosszú leírás... 
.PARAMETER MyParam1
    A MyParam1 paraméter leírása...
.PARAMETER MyParam2
    A MyParam2 paraméter leírása...
.EXAMPLE
    C:\PS> .\MyScript.ps1 –MyParam1 "egy"  
Az első példa leírása... .EXAMPLE C:\PS> .\MyScript.ps1 –MyParam2 2012 A második példa leírása... .NOTES Egyéb megjegyzés, például szerző, dátum...
Author: György Balássy Date: 2012.07.11. #>

Bemeneti paraméterek

Egy szkript vagy függvény bemeneti paramétereit a Param kulcsszóval definiálhatjuk. A paramétereknek adhatunk alapértéket is:

Param(
    $MyParam1,
    $MyParam2 = 10
)

Paraméter validálás

A paramétereknél a .NET-es attribútumokhoz hasonló szintakszissal megadhatunk típust, illetve néhány kényszert is:

Param(
    [parameter(Mandatory=$true)]  
[string]
[ValidateScript({Test-Path $_ -PathType 'Container'})] $MyParam1, [parameter(Mandatory=$false)]
[int]
[ValidateRange(-1, 31)] $MyParam2 = 10 )

Ezeken az attribútumokon kívül van még ValidateLength, ValidateCount, ValidatePattern, ValidateNotNull, ValidateNotNullOrEmpty is.

Mappa létezésének ellenőrzése

A Test-Path cmdlet segítségével ellenőrizhetjük, hogy egy vagy több mappa vagy fájl (általánosabban: útvonal) létezik-e, vagy akár csak azt, hogy a megadott útvonal érvényes-e (ld. –IsValid kapcsoló). A cmdlet $true értékkel tér vissza, ha az adott útvonal létezik:

if( $myPath -ne $null -and ( Test-Path $myPath ) -eq $true )
{
    Remove-Item $myPath -Recurse
}

Szkript leállítása

Egy futó szkript leállítására használhatjuk az exit kulcsszót, ami után tetszőleges hibakódot megadhatunk. Ha hibajelzéssel akarjuk leállítani a szkriptet, akkor jobb a throw kulcsszót használni, ami után megadhatunk egy szöveges hibaüzenetet és ami 1 hibakóddal állítja le a szkript futását. Normál esetben a szkript 0 hibakóddal fejeződik be.

if( ( Test-Path $cmd ) -eq $false ) 
{
throw "A $cmd értéke nem megfelelő!"
}

Színes betűk a konzolra

Ha jobban el akarjuk különíteni a szkriptünk által kiírt üzeneteket a felhasznált cmdletek vagy külső programok üzeneteitől, akkor írhatunk színesen a konzolra:

Write-Host "Valami történik..." -ForegroundColor Green

Dátum formázása

Néha szükségünk van a mai dátumra, méghozzá valamilyen formátumban, amit előállíthatunk például így:

$now = Get-Date -format yyyyMMdd_HHmmss;

Kimenet elhallgattatása

A kimenet “némítására” parancssorban általában a >null átirányítást szoktuk használni, de tapasztalataim szerint ez egy PowerShell szkriptben nem mindig azt csinálja, amit szeretnénk. Ez esetben bátran használhatjuk az Out-Null cmdletet:

mkdir $targetDir | Out-Null
[System.Reflection.Assembly]::LoadWithPartialName("MyAssembly") | Out-Null

Module vagy snap-in betöltése

Találkoztam olyan PowerShell bővítménnyel, amit PowerShell 1.0 alatt snapinként, 2.0 alatt pedig modulként kellett betölteni. Szerencsére le tudjuk kérdezni a PowerShell verziószámát és megifelhetjük a betöltést:

if( $PSVersionTable.PSVersion.Major -ge 2 )
{
  Import-Module MyModule
}
else
{
   Add-PSSnapin MyModule
}

Lásd Using Modules and Snap-Ins.

SQL adatbázis mentése

SMO segítségével így menthetünk SQL adatbázist:

[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO")
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SmoExtended")
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.ConnectionInfo")
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SmoEnum")

$s = New-Object ("Microsoft.SqlServer.Management.Smo.Server") "(local)" 
$b = New-Object ("Microsoft.SqlServer.Management.Smo.Backup") $b.Action = "Database" $b.BackupSetDescription = "Full Northwind backup" $b.BackupSetName = "Northwind backup" $b.Database = "Northwind"
$b.MediaDescription = "Disk" $b.Devices.AddDevice("C:\Backup\MyBackup.bak", "File") $b.SqlBackup($s)

IIS konfiguráció mentése

Az IIS konfiguráció mentéséhez használhatjuk az IIS  PowerShell Snap-Int:

Import-Module WebAdministration   # vagy  Add-PSSnapin
Backup-WebConfiguration "MyBackupName"

Szövegfájl sorainak feldolgozása

Get-Content $filePath | Foreach-Object
{ 
  # Sor feldolgozása a $_ változóval
}

 

A PowerShell megismeréséhez nagyon hasznos forrás Soós Tibor Windows PowerShell 2.0 rendszergazdáknak c. könyve.

 

Technorati-címkék: ,,,

Régebbi Technet tananyagok

Többen írtak nekem, hogy a régebbi cikkekben szereplő Technet oldalakra mutató hivatkozások egy része nem érhető már el, ezért összeszedtem a legfontosabb tartalmak új helyét:

A videók többsége megtalálható a videótárban és a Technetklub TV oldalon is, az e-bookok pedig a PDF-ek között.

 

Technorati-címkék: ,,,,,

localtest.me

Mi a közös az alábbi URL-ekben?

http://lvh.me
http://vcap.me
http://localtest.me
http://akarmi.localtest.me
http://barmi.localtest.me
http://akarmi.barmi.tokmindegy.localtest.me

Tipp: nézd meg pinggel, nslookuppal vagy tracert-tal!

Mindegyik a 127.0.0.1 címre mutat. Sőt, a *.localtest.me is, azaz annyi domaint faraghatok magamnak, amennyit csak akarok. Az első kettő már létezett korábban is, a localtest.me (vigyázat, nem localhost) viszont új és Scott Forsyth-nak köszönhető. Őt úgy egyébként például az 52 részes IIS-t bemutató videósorozatról ismerhetjük.

Aki még nem matatott hosts fájlokat csak azért, hogy több domain név mutasson a saját gépére, az ezt nehezen értékeli, nekem elég gyakran van rá szükségem. A több név mellett a másik szépség, hogy míg a http://localhost a Local intranet zónában van, addig a http://tudomisen.localtest.me az Intranet zónában.

Íme a ráadás: ehhez a domainhez létezik abszolút érvényes, nem önaláírt tanúsítvány, ami privát kulccsal együtt letölthető, így búcsút mondhatunk a tanúsítvány hibáknak.

A szolgáltatásról szóló bővebb leírás a readme.localtest.me oldalon található meg (ez tényleg a weben van Mosolygó arc).

 

Technorati-címkék: ,,

Feature detection .NET 4.5-ben

Ahogy januárban már írtam róla, az új 4.5-ös .NET Framework verziószáma (nagyjából) pontosan meg fog egyezni a 4.0 verziószámával, azaz in-place upgrade történik. (Hogy ez mennyire jó ötlet, arról még mindig lehet szavazni a januári cikk végén.) Akkor azt fejtegettem, hogy ez milyen problémákat fog felvetni, amikor a 4.0-ra tesztelt alkalmazásaink észrevétlenül 4.5-ön kezdenek el majd futni.

Na de most nézzük a fordított irányt. Íme az alábbi kiváló kódom, amit Visual Studio 11 alatt készítettem, .NET 4.5-re fordítva:

  static void Main(string[] args)
  {
    Console.WriteLine("Elindult.");
    Console.WriteLine("Vége.");
    Console.ReadLine();
  }

Kiválóan fut Windows 8-on. A lefordított EXE-t átviszem egy másik gépre, ahol nincs .NET 4.5 és ott is kiválóan fut! Nosza, használjunk valami spéci 4.5 feature-t:

  static void Main(string[] args)
  {
    Console.WriteLine("Elindult.");
    Console.WriteLine("Méret: " + GetSize().Result );
    Console.WriteLine("Vége.");
    Console.ReadLine();
  }

  private static async Task<int> GetSize()
  {
    WebClient wc = new WebClient();
    string content = await wc.DownloadStringTaskAsync(
new Uri(@"http://www.msdnkk.hu")); return content.Length; }

Ez .NET 4.5 híján is vidáman elindul, de futás közben elszáll:

W:\System\Desktop>VersionTest.exe
Elindult.

Unhandled Exception: System.TypeLoadException: Could not load type 
'System.Runtime.CompilerServices.IAsyncStateMachine' from assembly 
'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.
  at VersionTest.Program.GetSize()
  at VersionTest.Program.Main(String[] args)

Ez már nagyobb gond, hiszen senki sem szereti a futási idejű hibákat. Ha ez így van, akkor mégis mire jó a Project Properties ablakban a Target Framework opció?

project-properties

Ha átállítod:

[assembly: TargetFramework(".NETFramework,Version=v4.5", 
           FrameworkDisplayName = ".NET Framework 4.5")]
  • Az app.config fájlban megváltozik a supportedRuntime elemben az sku attribútum értéke (webalkalmazás esetén a compilation elemben a targetFramework attribútum értéke):
<?xml version="1.0"?>
<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/>
  </startup>
</configuration>

Vajon melyiket figyeli a runtime? A fenti példából egyértelműen látszik, hogy a .config fájlt. Ha nincs ott a konfig fájl, elindul az alkalmazás, és majd futási időben száll el. Ha ott van a konfig fájl, akkor el sem indul:

download45

Itt a Yes-re kattintva jelenleg a .NET Framework 4.5 Beta letöltése kezdeményezhető a Microsoft Download Centerből.

Próbáljuk elkerülni a futási idejű hibát, azaz próbáljuk kitalálni futási időben, hogy milyen verzión futunk. A hagyományos megközelítés a verziószámok lekérdezése az Environment.Version tulajdonságon keresztül. Az eredmény:

  • 4.0: 4.0.30319.544
  • 4.5: 4.0.30319.17379

Szóval sem a major, sem a minor, sem a build verziószámra nem támaszkodhatunk, legfeljebb a revisionre. Arról pedig nem tudunk semmit, tehát a “nagyobb, mint 17000” jellegű megközelítések elég kockázatosak (még ha működnek is jelenleg).

Vessük be a JavaScriptből már jól ismert feature detection megközelítést, azaz ne a verziószámot ellenőrizzük, hanem azt tudjuk meg, hogy a funkció, amit használni akarunk, támogatott-e:

private static bool IsAsyncSupported()
{
  return Type.GetType("System.Runtime.CompilerServices.IAsyncStateMachine", 
false) != null; }

Majd:

if(IsAsyncSupported())
{
  Console.WriteLine("Méret: " + GetSize().Result);
}
else
{
  Console.WriteLine("Frissíts 4.5-re!");
// Vagy ugyanez a funkció async nélkül megvalósítva...
}

Ez működik, de biztos, hogy ezt akarjuk?

Gyanítom, hogy lesznek ebből kellemetlenségeink. Íme egy kedves példa: most akkor a webalkalmazásunk milyen .NET verzión is fut (a .NET Framework version listában nincs is 4.5):

iis-apppool-versions

 

Technorati-címkék: ,,,