Archive for the ‘ASP.NET’ Category

Task.Run Etiquette Examples: Don’t Use Task.Run in the Implementation

Friday, May 8th, 2015

Az async – await dolgokkal fel lehet szabadítani pl. as ASP.NET által is használt ThreadPool szálakat, hogy míg egy hosszú ideig tartó nem CPU hanem IO intenzív folyamat fut, addig legyen szabad szál kiszolgálni a rendes, kicsi, gyors kéréseket.

De ha úgy aszinkronítunk egy blokkoló, IO intenzív kérést, hogy becsomagoljuk Task.Run-ba, akkor adtunk a sznak egy pofont, mert pont ugyanabból a ThreadPoolból vettünk el szálat, mint amit az ASP.NET is használ (feltételezve az alap TaskSchedulert használjuk). Ráadásul még context switch is lesz a szálak között, stb.

Az igazi aszinkron cuccosok (pl. .NET szerviz hívó osztályok és adatbázis kezelő osztályok) IO completion portot használnak, amivel sok blokkoló folyamatot tudnak monitorozni kevés szálon, nem minden egyes folyamathoz egy szálat használva, mint a Task.Run-os megoldás.

Bővebben a témáról itt.

Mire használja az MVC a machinekeyt?

Thursday, April 16th, 2015

A source alapján nekem úgy tűnik csak az AntiForgeryTokenhez. Van még szerintetek valami más szerepe is (nem webformsról beszélünk).

Tovább nézve látom az ASP.NET Identity is használja, a Tokeneket védeni.

Ha egy MVC site nem ad vissza semmit

Thursday, October 9th, 2014

De hibát se, akkor lehet egyszerűen nincs minden IIS modul feltelepítve, ami kell hozzá.

MemoryCache bug

Saturday, July 26th, 2014

A MemoryCache osztály ASP.NET hoszt alatt időnként Dispose-olja magát. Nagyon kedves. Mindezt úgy teszi, hogy nem dob semmiféle exceptiont, csak ha beleraksz valamit, nem marad benne.
4.5-ben fixálták, de 4.0-ra is van workaround vagy hotfix is. Részletek itt.

Overposting vagy Mass Assignment támadás ASP.NET MVC-ben

Thursday, April 10th, 2014

Nagyon hasznos a binder az MVC-ben, nem kell kézzel kiszedegetni a form értékeket és átmásolni a modellbe. De ha a modell több property-t tartalmaz mint amit a html formba kigenerálunk, akkor ki vagyunk téve egy támadásnak. Ugyanis minden további nélkül be lehet rakni a post kérésbe olyan mezőket is, amelyek nincsenek a formon, de benne vannak a modellben, így alapban, ha nem korlátozzuk le a binder szépen feltölti a modellt a fake bepostázott értékekkel is. Ez durva secu támadásokra ad lehetőséget.
A kivédésére itt bemutatnak sokféle megoldást. A legjobb szerintem az utolsó, amikor tényleg az adott view részére hozunk létre egy specifikus modellt, nem pedig a bindert próbáljuk meg lebeszélni a felesleges adatmásolásokról.

Ps. ma végzek a jelentkezési lappal mvc-ben a TDD tanfolyamra, nem véletlenül szól mvc-ról a post. :)

Rétegek közötti kommunikáció

Monday, February 10th, 2014

Tegyük fel emailt akarok küldeni egy weboldalról, amiben linkekeket kell elhelyezni, amik hivatkoznak a weboldal urljeire.
Az email generálás a business logic jellegű komponensekben van. Ezeknek nem illik kinyúlkálni HttpContextekbe meg mindenféle webes cuccokba, mert ők nem webes cuccok. De ebben az esetben mégis csak fel kéne dinamikusan deríteni, hol fut a webapp, mert urleket kell generálni.

Ha kézzel passzolom át a szükséges infót, így néz ki a hívási lánc:

ArticleController.ArticleEdit => (innentől BBL, nem web) IArticleManager.UpdateArticle => INotificationManager.ArticleModified => INotificationFormatter.SendNotification

Na, a NotificationFormatternek már tudni kell urleket gyártani, a felette futó website intrinsic property-jei alapján.
Ezt kézzel átpasszolni a teljes láncon ronda. Mi jöhet még szóba? Statikus változók, amit a webapp indulásakor pl. a global.asaxben feltöltök, és a BLL-ben kiolvasom? Nem tetszik, de egyszerű. Utálom a statikusokat, szétborítanak minden tesztet.
Létrehozni egy IWebEnvironment interfészt, amit a tesztekben fake-elek, élőben pedig szintén a web indulásakor betárazok a DI containerbe? Kicsit körmönfont, de ez egy fokkal jobban tetszik.
Ötlet?

MVC project indulás lassú

Thursday, January 30th, 2014

Normális, hogy minden egyes fordítás után fél percet kell várni, mire az mvc projekt elindul? Vagy csak nálam ilyen tetű lassú? Nem debuggerben, nem symbol issue, csak simán ránézve böngészőből. Cassinivel és iissel is. Hm?

XmlSerializer debugolása

Thursday, November 27th, 2008

Trükkös esetekben megbetegedhet az XmlSerializer, de kifelé nem mindig mondja el pontosan mi baja, csak annyit böffent, hogy nem tudtam xml doksit generálni. Ilyenkor jó, ha bele tudunk debugolni a kódjába. Amely, mint tudjuk dinamikusan generálódik és röptében fordítódik, hogy típusos, reflection nélkül tudja elérni a szerializálandó típus tagjait.
No, itt látható, hogyan kell rávenni a serializert, hogy miután lefordította a dinamikusan generált kódját, ne törölje le a forrást, hadd debugozzuk már meg. Ezek után már csak be kell kapcsolni a VS debugger/exceptions menüben, hogy a CLR exceptionökre áljon meg a debugger, aztán F5, és várjuk a becsapódást.

Annyi mindent tudnék mesélni az utóbbi hetekben történtekről, hogy csuda, de nincs időm. Majd januártól…

Mi az a Dynamic Data?

Wednesday, May 28th, 2008

5 perces kis videó a témáról.

Valami olyasmi cucc ez, amivel rendkívül gyorsan össze lehet rakni CRUD jellegű adatkezelő website-okat, de teljesen testreszabható módon, template alapon, nem sima kódgenerálással. Érdekes megoldás, de nem tudom mennyire lesz majd használható.

Ingyenes LINQ könyv

Saturday, December 22nd, 2007

Aki ezek után azt mondja, hogy nem volt honnan tanulnia, nem hiszek neki. :)

Van itt még Ajax meg SilverLight könyv is.

UPDATE: SQL Injection? – NEM

Saturday, October 27th, 2007

http://www.cegtudor.hu/Alkategoria.aspx?varos=%C3%89rd&alkategoriaid=232&alkategorianev=kis%20%C3%A9s%20nagyker

Kimenet:
Input string was not in a correct format.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.FormatException: Input string was not in a correct format.

Source Error:

Line 28: mySqlCommand2.CommandText = “UPDATE kategoria SET latogatok = latogatok + 1 WHERE (kategoriaid LIKE @kategoriaid);”;
Line 29: mySqlCommand2.Parameters.Add(“@kategoriaid”, SqlDbType.Int);
Line 30: mySqlCommand2.Parameters[“@kategoriaid”].Value = Convert.ToInt32(LabelKid.Text);
Line 31: mySqlCommand2.ExecuteNonQuery();
Line 32: mySqlConnection2.Close();

Fura, mik vannak még a mai világban. Persze, mivel a paraméter int, nem egyszerű a dolog, de valószínűleg a többi rész is így van programozva.

UPDATE: baromságot beszéltem. Paraméteres a lekérdezés, teljesen jól van megcsinálva, így nem lehet injektálni. Elnézést, hogy pellengérre állítottam, szólok az ikreknek, hogy adjanak több időt aludni, addig is, nem blogolok több hülyeséget. :) Sorry.

Egy, ami nem szép, hogy debug módban van a kód, és a részletes hibaüzenetek látszanak kifelé. Ez is kiindulási alap lehet egy hacker részére.

Az aljas XmlDataSource cachelés

Saturday, August 25th, 2007

Az egyik kedves ismerősöm keresett meg egy problémával, amiben véletlenszerűen gond volt egy DataBind-olt DropDownList-tel.

Kicsit körbejárva a problémát kiderült, hogy az XmlDataSource alapban cache-el keményen, ami statikus XML fájlok esetén nem lenne nagy gond, sőt, de dinamikus bemenetnél alattomos hibákat okozhat.
Az alábbi kódot párszor futtatva azonnal látszik a cache-elés okozta hiba, míg a xds.EnableCaching = false; sor hatására megszűnik.

[source:xhtml]
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>




Untitled Page




[/source] [source:csharp]
using System;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class _Default : System.Web.UI.Page
{
int a;
string[] gy = { “alma”, “korte” };

protected void Page_Load(object sender, EventArgs e)
{
XmlDataSource xds = new XmlDataSource();
//xds.EnableCaching = false;
this.Controls.Add(xds);
xds.ID = “d”;
a = new Random().Next(0, 2);

xds.Data = string.Format(
@”


“,
a, gy[a]);
xds.XPath = “Data/Row”;
ize.DataSourceID = “d”;
}

protected override void Render(HtmlTextWriter writer)
{
base.Render(writer);

int b = int.Parse(ize.Items[0].Value);
if (b != a)
{
throw new InvalidOperationException(
string.Format(
“Baj van, elvárt érték a lista első elemében: {0}, tényleges: {1}”,
a, b));
}
}
}

[/source]

Az ASP.NET debug=”true” káros hatásai

Tuesday, August 14th, 2007

Nem is gondolná az ember, mennyire sok ponton ront az alkalmazás teljesítményén és okozhat furcsa gondokat, ha a debug verziót használják éles websiteokon. Megér egy misét végigfutni.

IIS és .NET 2.0 interjú kérdések

Thursday, August 9th, 2007

Jók, érdekesek, némelyik rázós.

Monorail is cool?

Wednesday, August 8th, 2007

Legalábbis ő azt mondja. Én még nem ismerem, de amint lesz egy kis időm, innen kiindulva tanulmányozom. Amúgy egy ASP.NET-re épülő frameworkről van szó, bár nekem elsőre rubynak tűnt – a neve miatt.

Web.config olvasás medium trust esetén

Thursday, July 5th, 2007

Internetszolgáltatók shared hosting esetén általában medium trustra állítják be a webappokat, így azok nem tudják szétbabrálni a gépet, az nt secu mellé még a .NET CAS secu is besegít.
Néha ez gondot okoz, pl. a log4net se tudja kiolvasni a konfigját, mert a CAS megakadályozza ebben. Pedig ez nem olyan vészes dolog.

ASP.NET 2.0-ban már meg lehet mondani, hogy egy szekció olvasása okozzon-e CAS Demandot, magyarul, kell-e hozzá erősebb jog, vagy sem. Erről szól a konfig szekció requirePermission attributuma. A háttérben ez a ConfigurationPermission új 2.0-s permissionre épít. A reflector analyze funkciójával megnézve látható, hogy a BaseConfigurationRecord.CheckPermissionAllowed metódus intézi el a kérdést:

[source:c#]
private void CheckPermissionAllowed(string configKey, bool requirePermission, bool isTrustedWithoutAptca)
{
if (requirePermission)
{
try
{
UnrestrictedConfigPermission.Demand();
}
catch (SecurityException exception)
{
throw new SecurityException(SR.GetString(“ConfigurationPermission_Denied”, new object[] { configKey }), exception);
}
}

}
[/source]

Supervising Controller pattern

Tuesday, April 24th, 2007

Architektúra kedvelőknek egy jó kis cikk a Supervising Controller pattern használatáról ASP.NET-ben.

Balássy Gyuri Ajaxos szerszámosládája

Tuesday, March 27th, 2007

Ha Ajaxolnék, most örülnék nagyon.

Impersonation ASP.NET-ben, de csak rövid időre

Monday, October 30th, 2006

A technetklub levlistán jött elő ez a kérdés, hogyan lehet egyes műveleteket megszemélyesített kontextusban futtatni, míg a lap többi része default környezetben fut?

A megoldás (2.0) a LogonUserIdentity osztály használata.

Írtam hozzá kis példakódot a tudástárba.

Érdekelne, hogyan lehet kinyerni direktben, hogy impersonation alatt vagyunk-e, vagy az eredeti tokennel fut a szál?

URL rewiting asp.netben

Friday, October 20th, 2006

Aki a kérdőjeles, querystringes, ? majomkodós old school urlek helyett statikusnak kinéző normál pathokat szeretne használni asp.net-ben, az nézze meg ezt a kis open source libet.