Skip to main content

Posts

Showing posts from November, 2011

Detecting Session Timeouts

Durata de viata a unei sesiune se poate seta din fisierul de configurare. Valoarea minima pe care o poate avea este 1 minut: <sessionStatemode="InProc" timeout="1" /> Cand setati durata de viata la sesiune trebuie sa avegi grija ca IIS, by default face recyle la AppPool odata la 120 de minute. Ambele valori trebuie modificate daca doriti ca durata de viata a sesiunii sa fie mai mare.
Dintr-o aplicatie ASP.NET, folosid metoda Session_End din Global.asax nu o sa puteti prinde mereu acest eveniment. Pentru mai multe detalii: http://vunvulearadu.blogspot.com/2011/11/when-sessionend-is-called.html.
Pentru a putea detecta daca o sesiune este noua putem sa verificam valoarea propietatii Session.IsNewSession.Aceasta propietate este TRUE cand sesiune este noua.
Folosit aceasta propietate pe ASP.NET MVC3 ne putem declara un action filter prin intermediul caruia sa detectam daca sesiunea a expirat.
publicclassSessi1onExpireFilterAttribute : ActionFilterAttribute{publicover…

ViewBag don't contains items which are set in the partial view

Astazi vreau sa vorbim despre ViewBag. Daca nu l-ati folosit pana acuma, in MVC 3 acesta este un dictionar dynamic, in care se pot pune valori pentru a fi trasmise de la controller la view date. Cel mai nice lucru la el este ca este un tip de data dynamic. Cea ce inseamna ca putem sa facem get/set la date folosind propietati pe post de keys. In loc de:     ViewData["DateNow"] = DateTime.Now;
    ViewData["Age"] = 55; Avem:     ViewBag.DateNow = DateTime.Now;
    ViewBag.Age = 55; Sa trecem la lucruri mai interesante. Daca avem un View care contine un partial view in care populam ViewBag-ul( desii nu e sanatos poate sa apara cazul acesta), o sa observam ca in view-ul parinte sau in _Layout, ViewBag-ul nostru nu contine elementele pe care le-am adaugat. Prima reactie este sa spunem ca este sa spunem ca este un bug. Daca ne uitam putin peste cum functioneaza MVC 3 o sa descoperim ca de fapt la partial view primeste propiul sau ViewBag. Solutia pentru a rezolva aceast…

Why to use/not to use Server.Transfer

Care sunt avantajele/dezavantajele folosirii Server.Transfer in loc de Resposese.Redirect? Server.Transfer nu trimite la brower un mesaj prin care ii spune sa incarce o alta pagina. Din aceasta cauza nu se mai face un drum pana la client pentru a face redirectarea. Prin acest mecanism serverul nu mai trebuie sa rezolve atatea cereri HTTP. Trebuie avut grija deoarece Server.Transfer pastreaza URL original la client. Cea ce poate sa ne induca in eroare la debug sau daca vrem sa facem SEO. Daca vrem sa redirectam userul spre o pagina externa( de exemplu www.google.ro), atunci Server.Transfer nu o sa poate sa fie folosit. Server.Transfer are un parametru optional denumit “preserverForm”, care daca este setat pe TRUE, query-ul string-ului si toate variabilele din forma sunt trimise mai departe. Exista un bug care apare uneori cand vrem sa transferam aceste valori. Pentru a evita aceast bug putem sa setam "enableViewStateMac" pe TRUE pe pagina spre care facem redirectare.

#IF DEBUG can be replaces with Conditional attribute

Pe un proiect legacy la care am lucrat anul acesta apareau destul de conditia urmatoare:
#if DEBUG      //Some code #endif Natura proiectului ne obliga sa avem astfel de cod. Problema era ca uneori noi compilam proiectul configurat pentru RELEASE, faceam modificari la cod si in RELEASE totul parea in ordine, dar pe masina de build, aveam erori de compilare, deoarece acesta compila in DEBUG.
Am descoperit zilele acestea un nou atribut care poate sa inlocuiasca aceasta conditie urata.
[Conditional("DEBUG")] public static void DoSomething() {      //Some code } Metoda DoSomething o sa fie apelata doar in cazul proiectul este compilat in DEBUG mode.
Cand putem sa folosim aceast atribut?
se poate folosi doar in interiorul unei clase sau a unei structuri. Nu incercati sa il puneti pe metoda unei interfete, deoarece o sa dea eroare la compilaremetoda pe care o decorati cu acest atribut nu trebuie sa fie neaparat statica, dar nu are voie sa fie implementarea  unei metode din interfa…

Prezentare CODECAMP - Windows Phone: multitasking and local database

Astazi urmeaza sa tin o prezentare CODECAMP in Bucuresti. Ne vedem acolo.

When: 26 noiembrie 2011
Where: sediul Microsoft România din Piaţa Presei Libere nr. 3-5, Clădirea City Gate Sud, etaj 2, sala Remus
Title: Windows Phone: multitasking and local database
Presentation slides: http://www.slideshare.net/raduvunvulea/windows-phone-multitasking-and-local-database


DateTime.AddDays(x)

Care este greseala in codul de mai jos:
for(DateTime date=beginDate;date<=endDate;date.AddDays(1)) { // Executa cod. } Problema apare in for, unde date va fi mereu mai mic ca endDate.
Cauza este AddDays, care nu adauga la data curenta o anumite valore ci returneaza o noua data. Nu trebuie sa uitam ca DateTime este un value type.
Codul corect este:
for(DateTime date=beginDate;date<=endDate;date = date.AddDays(1)) { // Executa cod. }

No connection could be made because the target machine actively refused it xxx.xxx.xxx.xxx:8172

Trebuia sa fac un partial deploy pe Azure la un web role in aceasta dimineata. M-am trezit cu urmatoarea eroare:
No connection could be made because the target machine actively refused it xxx.xxx.xxx.xxx:8172 Am inceput sa verific web rolul sa vad daca firewall-ul este pornit si daca blocheaza portul 8172. Totul parea in regula.
Problema a fost de cand am facut full deploy-ul. Uitasem ca activez optiunea de partial web deploy.
Va puteti da destul de usor seama daca ati activat partial deploy pe un web role daca incercati sa accesati adresa https://xxxx.cloudapp.net:8172/MsDeploy.axd . In cazul in care serverul nu raspunde atunci sunt mari sanse sunt ca partial deploy sa nu fie activ pe web rol-ul respectiv.

What to use? Event or delegate?

Un eveniment este de fapt un delegate mai special. Comportamentul este destul de asemanator a unui eveniment in interiorul clasei unde este declarat, dar in afara acestei clase singurul lucru care se poate face este subscribed si unsubscribed. In momentul cand cineva face (un)subscribed, putem sa executam actiuni specifice prin definirea explicita a actiunilor de "Add" si "Remove"( per event).
Chiar daca pentru un eveniment putem sa specificam nivelul de acces( public, protected, private, internal), asta nu inseamna ca oricine poate sa faca raise la eveniment. Doar clasa care contine evenimentul poate sa faca raise la eveniment.
In mod normal evenimentele nu trebuie sa execute o actiune pe obiectul care contine acest eveniment, ele trebuie doar sa notifice abonatii ca ceva s-a intamplat. Din aceasta cauza evenimentele trebuie privite ca ceva optional. Aruncarea evenimentului este ceva optional, iar orice exceptie aparuta in momentul respectiv nu ar trebuii sa afect…

Windows Phone 7.5( Mango) support SQL CE

Windows Phone 7.5( Mango) suporta SQL CE(SQL Compact Edition). Acest feature era de mult timp asteptat. Acuma sa vedem cum se foloseste.
Baza de date poate sa fie pusa in doua locatii:
isolated storageinstallation folder In functie de locatie si de parametrii, stringul de conexiune poate sa aibe urmatoarea forma:
Data Source = 'isostore:/MyDB.sdf; - cand baza de date este in isolated storageData Source = 'isostore:/MyDB.sdf';Password='1234'; - cand baza de date este in folderul unde aplicatia a fost instalata si este encriptata cu parola 1234 La stringul de conexiue putem sa setam si alte valori precum culture-ul( "Culture Identifier") si daca este case sensitive( "Case Sensitive").
Trebuie sa tinem cont ca avem cateva limitari pe Mango cand vrem sa folosim SQL CE:
fisierele sdf sunt stocate si deschise din isolation storagedaca dorim un mecanism de ORM este nevoie sa folosim LINQ2SQL T-SQL queries nu este suportat( nu putem sa avem tranzactii)o re…

Visual Studio 2010 extensions

Zilele acestea am fost constrans de un upgrade la OS care mi-a omorat masina sa instalez de la 0 toate aplicatiile. Mai jos o sa gasiti lista de extensii pentru Visual Studio 2010 pe care le folosesc:
Code alligment - il folosesc cand am nevoie sa aliniez codul dupa un anumit caracter( de exemplu cand trebuie sa aliniez cateva linii de cod dupa '=').Indent Guides - traseaza linii verticale pentru fiecare nivel de intentare in parte.PowerCommands for Visual Studio 2010 -  mai multe comenzi pe partea de management la proiecte si soluții.Productivity Power Tool - cel mai mare plus care l-a adus pentru mine a fost fereastra de add/remove references.Spell Checker - face check la spelling pentru string-uri, comnent-uri si plain text.VSCommands 2010 - coloreaza diferit codul scris iar cand dam click dreapta pe un fiser/director/proiect/solutie ne ofera noi functionalitati precum: deschidere CMD cu path-ul setat in directorul curent, copy class, copy full path etc. Enjoy!

How to store an array of booleans in a int

Uneori ajungem sa ne dorim sa stocam intr-un int mai multe valori booleene( de obicei de dragul artei) pentru a salva a avea mesajele care se trimit pe tiava cat mai mici. O solutie pe care o propun este sa folosim BitArray.
Acesta ne permite sa lucram cu biti. Pentru a initializa si seta valoriile unui BitArray trebuie sa scriem urmatorul cod:
BitArray bits = new BitArray(32); // 32 - numarul de biti pe care il ocupa un int  bits[0] = true; ... bits[31] = false; Urmatorul pas este sa convertim un BitArray in int. Acest lucru se face destul de usor cu metoda CopyTo:
int[] valueConverted = new int[1]; bits.CopyTo(valueConverted,0); // 0 - reprezinta indexul de inceput  int result = valueConverted[0]; In result am obtinut int-ul care contine BitArrat-ul nostru.Pentru a executa procesul invers, sa obtinem un BitArray dintr-un int este nevoie sa apelam metoda statica GetBytes a clasei BitConverter.
BitArray bits = BitConverter.GetBytes(result); Ce alta solutie aveti pentru aceast task?

How to manualy set the location from where a controller is loaded

Uneori ajungem ca unul sau mai multe controale sa fie definite intr-un assembly diferit fata de proiectul MVC 3 pe care il avem. Pentru a putea controla mecanismul de incarcare a controalelor este nevoie sa ne definim propiul nostru controller factory.
Trebuie sa ne definim o clasa care sa implementeze interfata IControllerFactory. In cazul in care vrem sa pastram si vechia functionalitate care exista by default putem sa implementam clasa DefaultControllerFactory si sa facem override la CreateController. Aceasta metoda primeste doi parametrii
requestContext - care contine date despre requestcontrollerName - numele la controller In interiorul acestei metode pe baza numelui la controler si a contextului trebuie sa returnam instanta controlerului nostru.

publicclassMyControllerFactory : DefaultControllerFactory     {         publicoverrideIController CreateController(
System.Web.Routing.RequestContext requestContext,                                                      stringcontrollerName)…

Evenimente IT de toamnă - CodeCamp și ITSpark

http://itspark.ro/b/blog/archive/2011/11/10/evenimente-it-de-toamna-codecamp-si-itspark.aspx

In aceasta luna o sa aibe loc o serie de eveniment IT in Timisoara, Oradea, Cluj, Iasi si Bucuresti. Codecamp impreuna cu ITSpark si SQLServer.ro organizeaza aceasta serie de evenimente gratis.
Lista de evenimente, formularele de înscriere și agenda din fiecare locație le găsiți mai jos:
Timișoara - vineri, 18 noiembrie 2011Oradea - sâmbătă, 19 noiembrie 2011Cluj - marți, 22 noiembrie 2011Iași - sâmbătă, 26 noiembrie 2011București - sâmbătă, 26 noiembrie 2011 Ne vedem acolo!.

ToLower - optimization

Mai mult ca sigur stiti ce face metoda ToLower( cand vreti sa transformati un string, pentru a avea toate caracterele mici este nevoie sa apelam la aceasta metoda).
Daca ne uitam peste definitie, o sa observam ca exista 3 variante
ToLower()ToLowerInvariant()ToLower(CultureInfo cultureInfo)Cele 3 metode fac acelasi lucru, cel mai mult m-a interesat daca exista diferente de performanta intre ele. Am rulat codul de mai jos de 100.000.000 de ori.
string uppertText = "Salut. Ce MAI fACI?";
CultureInfo cultureInfo = CultureInfo.CurrentCulture;
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
for( int i=0; i<100000000; i++)
{
string lowerText = upperText.ToLower();
//string lowerText = upperText.ToLowerInvariant();
//string lowerText = upperText.ToLower(cultureInfo);
}
stopwatch.Stop();
Console.WriteLine("Elapsed type: {0}",stopwatch.Elapsed);

Rezultatul pe care l-am obtinut este destul de interesant:
ToLower() - 10.51 sToLowerInvariant() - 17.32 sToLower(CultureInf…

How to use Bing Maps v7

In ziua de azi, de la o poza sau un document pana la un colet trimis prin curier sau localul la care ai iesit aseara poate sa fie track-uita pe harta. Aceste harti sunt oferite gratis (Bing, Maps, Google Maps etc), iar singurul lucru pe care trebuie sa il cunoastem sunt coordonate GPS.
Un utilizator poate sa foloseasca aceste harti fara nici o problema, iar cea mai mare parte din persoanele care iti acceseaza web situl nu o sa aibe probleme cu folosirea unei harti. Mai jos o sa discutam despre cum putem sa integram si sa folosim Bing Maps in web situl nostru.
Exista mai multe versiuni de API pentru Bing Maps, ultima versiune (vs 7.0) a fost regandita de la 0 si a devenit extrem de usor de folosit. O sa ne uitam peste versiunea 7.0, care este integrata in totalitate cu ajax.
Tot setup-ul se face din java script. Primul pas este sa ne cream un obiect de tip Map si sa specificam zona de pe pagina unde sa apara:
<head>
...
<script type="text/javascript" src="http:/…

EWS - Reply command - odd behavior

In ultima perioada am inceput sa lucrez cu serverul de Exchange prin intermediul la EWS si am observat un comportament nenatural, care poate sa genereze erori daca nu exista unit-teste pentru acest flow.
Se da actiunea de reply. Pe exchange avem o comanda separata, care genereaza automat mesajul de reply si face autofill la TO si CC. Pana aici nimic special, doar ca aceste doua liste nu ne sunt returnate de serverul de exchange, dar in momentul in care se face SEND, ele se completeaza automat.
Dar ce se intampla daca vrem sa adaugam inca o adresa de email in lista de TO. Dupa ce adaugam un email si executam actiunea de send o sa avem parte de o surpriza. Mesajul este trims doar la persoana respectiva si atata.
Ce se intampla? Se face override la lista, chiar daca avem o List si noi apelam metoda Add.
Solutie: In mesajul de raspuns trebuie sa adaugam manual lista de adrese. Sa nu uita ca FROM devine TO.