IIS Express 7.5 stand-alone

IIS Express jest nowym, developerskim serwerem www mającym zastąpić aktualnie “wbudowanego” w Visual Studio Cassiniego. IIS Express, w porównaniu to Cassiniego, jest o wiele bardziej wydajny oraz oferuje więcej możliwości konfiguracji (np. uruchomienie aplikacji na https).

Aktualnie nowy serwer instaluje się razem z WebMatrixem (od wersji beta 3 instaluje się już jako osobna aplikacja). Finalna wersja serwera IIS Express będzie w pełni niezależną aplikacją, jednak aktualnie domyślnie jest on zarządzany poprzez WebMatrixa.

Można jednak inaczej :) Już teraz mamy możliwość wystartowania serwera IIS Express bez uruchamiania WebMatrixa – w konsoli. czytaj dalej

log4net – logujemy zdarzenia w aplikacji

Dzisiaj chciałbym poruszyć ważny element tworzenia aplikacji – logowanie zdarzeń. Odpowiednio przygotowane logi są często jedynym sposobem na zdiagnozowanie problemu w aplikacji, dlatego warto o tym pamiętać i z logowania korzystać.

Logowanie można przeprowadzić na wiele sposobów – ja chciałbym opisać przykład oparty na darmowej bibliotece log4net.

Temat ten podzieliłem na trzy części:

  • dzisiaj pokażę jak korzystać z log4net
  • w następnym poście pokażę, jak czytać/analizować logi
  • na koniec opiszę podstawową konfigurację log4net

To zaczynamy:
bibliotekę pobieramy ze strony: http://logging.apache.org/log4net/download.html. Z pobranego archiwum wypakowujemy plik: log4net.dll (incubating-log4net-1.2.10.ziplog4net-1.2.10binnet2.0releaselog4net.dll) i wgrywamy go np. do katalogu “lib“. Następnie dodajemy referencję do tego pliku.

log4net1

W swoich aplikacjach korzystam z takiej klasy:

[sourcecode language=”csharp”]
public class LogHelper
{
static LogHelper()
{
var confFile = ConfigurationSettings.AppSettings.Get("log4net.config");
var fi = new FileInfo(confFile);
XmlConfigurator.Configure(fi);
}

public static ILog GetLog()
{
return LogManager.GetLogger("WebAppLog");
}
}
[/sourcecode]

Jak widać w pliku Web.config podajemy ścieżkę do pliku konfiguracyjnego, czyli:

[sourcecode language=”xml”]
<appSettings>
<add key="log4net.config" value="conflog4net.config"/>
</appSettings>
[/sourcecode]

Brakuje jeszcze zawartości pliku log4net.config:

[sourcecode language=”xml”]
<log4net>
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender,log4net">
<file value="logstest_log.log" />
<lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
<param name="StaticLogFileName" value="true"/>
<appendToFile value="true" />
<param name="RollingStyle" value="Date"/>
<param name="DatePattern" value="yyyy-MM-dd"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %type.%method – %message%newline"/>
</layout>
</appender>

<logger name="WebAppLog">
<level value="ALL" />
<appender-ref ref="RollingLogFileAppender" />
</logger>
</log4net>
[/sourcecode]

Podana konfiguracja zapisuje logi do pliku (może to być również baza danych, e-mail, konsola lub inne źródło) – file określa, do jakiego pliku będą zapisywane logi, a layout określa format zapisu logów.

Samo logowanie jest operacją niezwykle prostą:

[sourcecode language=”csharp”]
LogHelper.GetLog().Info("My sample comments");
[/sourcecode]

lub

[sourcecode language=”csharp”]
catch (Exception ex)
{
LogHelper.GetLog().Error("Error occurred!", ex);
}
[/sourcecode]

log4net dostarcza kilka poziomów logowania:

  • Debug
  • Info
  • Warn
  • Error
  • Fatal

Nazwy poziomów logowania są bardzo czytelne i nie wymagają większego opisu.

Powyższy kod w logu zapisać może coś takiego:

[sourcecode language=”text”]
2009-12-07 22:22:33,202 [8] INFO  LogForNetWebSample._Default.Page_Load – My sample comments
2009-12-07 22:22:33,292 [8] ERROR LogForNetWebSample._Default.Page_Load – Error occurred!
System.DivideByZeroException: Attempted to divide by zero.
at LogForNetWebSample._Default.Page_Load(Object sender, EventArgs e) in Default.aspx.cs:line 14
[/sourcecode]

Jak widać log zawiera wiele cennych dla nas informacji – wiemy, kiedy i co się zdarzyło oraz w jakiej metodzie. Wiemy również, co działo się w aplikacji zanim wystąpił wyjątek.

Osobiście jestem zwolennikiem logowania jak największej ilości zdarzeń w naszej aplikacji – użytkownik wchodzi na stronę, klika button A, pobrano dane użytkownika, itp – jako poziom Debug. Przy przenoszeniu aplikacji na serwer produkcyjny możemy ograniczyć poziom logowania i logować jedynie logi z poziomu Error, Fatal czy Warn – bez zmiany kodu aplikacji!
log4net jest biblioteką bardzo elastyczną i posiada wiele parametrów konfiguracyjnych.

Oczywiście podczas logowania trzeba uważać, żeby nie zalogować danych poufnych – np. haseł.

Dzisiaj to tyle – zachęcam do zabawy z log4net i czytaniem logów – tylko uwaga – TO UZALEŻNIA!! :)

ReSharper 5.0 Nightly Build – In Action

Od jakiegoś czasu – a dokładnie od 19 listopada – udostępniono do testów nową wersję ReSharpera –  5.0. Jest to co prawda dopiero wersja beta, ale nie mogłem odmówić sobie przyjemności przetestowania :)

Pierwsze wersje trochę mi namieszały, ale reinstall Visual Studio pomógł. Ostatnio zainstalowana przeze mnie wersja 5.0.1537 póki co działa stabilnie.

Nowy Resharper oferuje wsparcie dla VS 2008 oraz VS 2010.

resharper_1

Poza wsparciem dla nowego VS, Resharper 5.0 oferuje sporo nowych przydatnych funkcji:

Wsparcie dla ASP.NET

  • nowe okienko “File structure” pokazujące budowę pliku aspx, ascx
  • generowanie placeholedrów i automatyczne powiązanie ich z MasterPagem
  • funkcja Go to file member pozwala szybko “powędrować” do innego powiązanego pliku, np.: MasterPage, kontrolki użytkownika
  • automatyczne generowanie referencji do kontrolek :)
  • nowe templaty do generowania contentu strony oraz szablony plików

resharper_6

Wsparcie dla ASP.NET MVC

  • lepsze (niż VS) wsparcie w intellisense
  • nawigacja pomiędzy powiązanymi obiektami
  • tworzenie nowych typów i metod

Możliwość debugowania źródeł .NET oraz bibliotek, dla których posiadamy pliki pdb.

Bardzo przydatne -np. na ToString() klikamy “Go to definition” i podglądamy, co się kryje w środku.

resharper_2

resharper_3

Bookmarki

Kolejna ciekawa nowość. Dodajemy bookmarka i później możemy bardzo szybko w dane miejsce wrócić. Domyślnie za pomocą skrótów możemy zarządzać 10 bookmarkami – ctrl+shift+numer (np. ctrl+shift+1) dodajemy bookmarka, ctrl+numer “wędrujemy” do bookmarka.

resharper_5

resharper_7

Oczywiście możemy dodawać więcej bookmarków (tzw. anonymous bookmark) i tylko w tej sytuacji, chcąc do niego “powędrować”, musimy go wybrać z listy (najpierw: ctrl+shift+’)

resharper_8

“Historia wartości”

Nowe okienko pokazujące, jak “wędrowała” wartość jakiejś zmiennej pomiędzy metodami.

resharper_4

Na powyższym screenie widać, że nasza zmienna testValue została przekazana jako parametr metody SampleMethod. Wartość zmiennej przekazanej do tej metody została przekazana z GetSampleValue, a w tej metodzie przypisaliśmy jej wartość 10 – czysto i przejrzyście.

To na razie tyle z nowych funkcjonalności, które przetestowałem – kolejna wersja i kolejny raz WIELKIE WOW :). O nowych ciekawych doświadczeniach postaram się informować na bieżąco.

Więcej o nowej wersji ReSharpera na stronie: http://blogs.jetbrains.com/dotnet/2009/10/resharper-50-overview/.

Nowe wydania R# 5.0 można pobrać ze strony: http://www.jetbrains.net/confluence/display/ReSharper/ReSharper+5.0+Nightly+Builds

Przenosiny zakończone

Wczoraj zakończyłem przenosiny bloga na nowy hosting – tym razem wybór padł na firmę webio.pl

webio_logo

Do tej pory korzystałem z yeahhost.com – oferta korzystna finansowo, usługa stabilna, jednak nie byłem zadowolony z szybkości działa stron.

Od nowej usługi oczekuję polepszenia tego elementu – pierwsze wrażenia są wyjątkowo pozytywne.

Dodatkowo Webio zapewnia dostęp do najnowszych technologii Microsoft:

  • IIS 7
  • MS SQL2008
  • ASP.NET 3.5
  • ASP.NET MVC
  • ASP.NET MVC 2 Preview 2 !!
  • oraz możliwość synchronizacji zadań, kontaktów, poczty elektronicznej i notatek za pomocą protokołu SyncML – co jest szczególnie przydatne jeżeli korzystamy w urządzeń mobilnych

Jest to bardzo duży plus dla mnie jako programisty!

Attach to Process… (ASP.NET) – szybciej

Pracując nad jakąś aplikacją czasami musimy ją zdebugować. Sposobów na to jest wiele – np. podpinając się pod odpowiedni proces. U mnie standardowo wygląda to tak: menu Debug->Attach to Process…->w3wp.exe.

Wykonuję tę operację dość często.

Jak wiele czynności w pracy z komputerem można tę operację zautomatyzować, tworząc np. makro.

W Visual Studio wybieramy: Tools->Macros->Macros IDE

attache_to_process_1

Dodajemy nowy moduł, nadajemy mu nazwę, np. RecordingModule:

attache_to_process_2

i wpisujemy makro:

[sourcecode language=”vbnet”]
Imports System
Imports EnvDTE
Imports EnvDTE80
Imports EnvDTE90
Imports System.Diagnostics

Public Module RecordingModule
Sub AttachToAspNET()
Try
Dim dbg2 As EnvDTE80.Debugger2 = DTE.Debugger
Dim trans As EnvDTE80.Transport = dbg2.Transports.Item("Default")
Dim compName As String = Environ$("computername")
Dim proc2 As EnvDTE80.Process2 = dbg2.GetProcesses(trans, compName).Item("WebDev.WebServer.EXE")
proc2.Attach2()
Catch ex As System.Exception
MsgBox(ex.Message)
End Try
End Sub

End Module
[/sourcecode]

Oczywiście w ten sposób możemy podpinać się pod dowolny proces. W przypadku ASP.NET, w zależności od tego, z jakiego serwera korzystamy będzie to:

  • WebDev.WebServer.exe – środowisko uruchamiane przez VS
  • w3wp.exe – IIS 6.0
  • aspnet_wp.exe – IIS 5.0, IIS 5.1

Aby uruchamiać makro, najprościej jest podpiąć je pod skrót klawiaturowy.

Z menu wybieramy: Tools->Options->Environment->Keyboard i wybieramy nasze makro:

attache_to_process_3

Po przypisaniu skrótu (u mnie ALT+CRTL+K) klikamy Assign, zamykamy okno opcji  i cieszymy się nowym makrem :)

Xenu – wygrać z 404

Tworząc aplikacje /strony internetowe dobrze jest zadbać, aby dla każdego linku istniało miejsce docelowe :)

Nie stanowi to problemu, kiedy mamy małą stronę (składającą się z 5,6 podstron), ale przy większych (szczególnie kiedy kontent jest generowany dynamicznie), często stanowi to problem. Ciężko jest również “przeklikać” stronę i sprawdzać, czy wszystkie linki są prawidłowe.

Z pomocą przychodzi mały, ale wręcz genialny program – Xenu. Zadaniem tego programu jest analizowanie strony w poszukiwaniu “złych” linków. Xenu sprawdza nie tylko linki do stron, ale również adresy sktryptów javascipt, css, obrazów.

Program można pobrać ze strony: http://home.snafu.de/tilman/xenulink.html.

Instalacja programu jest banalna, więc nie będę jej opisywał.

Po uruchomieniu programu wybieramy “File -> Check URL…”

xenu1

Podajemy adres strony, klikamy OK …

xenu2

… i czekamy, aż Xenu skończy swoją pracę

xenu3

Na zakończenie otrzymamy raport prezentujący listę znalezionych linków oraz status określający, czy dany link jest prawidłowy, czy też nie.

Myślę, że Xenu jest obowiązkowym narzędziem każdego, kto tworzy strony www.

Screencast: 1. AJAX – wprowadzenie

Zapraszam na pierwszą część z serii screencastów dotyczących wykorzystania AJAXa w ASP.NET.

Pierwsza część jest jednocześnie jedyną w pełni teoretyczną. Omawia historię powstania AJAXa oraz krótkie wprowadzenie, które pozwoli rozumieć działanie przykładów przedstawionych w kolejnych częściach.

Zapraszam do oglądania i czekam na komentarze :)

Darmowy hosting z ASP.NET 4.0 beta

Nie lada gratka dla każdego programisty ASP.NET :)

Firma ORCS Web udostępniła darmowy hosting z ASP.NET 4.0 beta(!). Oferta przeznaczona jest jedynie dla projektów testowych i nie zawiera m.in. e-maili, FTP czy panelu administracyjnego.

Otrzymujemy natomiast:

  • Windows Server 2008 / IIS 7
  • ASP.NET 4.0beta
  • 200MB miejsca na naszą aplikację
  • 100MB na bazę SQL Server 2008

Nasze konto będzie aktywne do końca października.

Ponieważ darmowe konto nie posiada konta FTP, naszą aplikację wgrywamy za pomocą narzędzia Web Deployment Tool (MsDeploy). Narzędzie to jest dołączone do Visual Studio 2010 lub można je pobrać ze strony Web Deployment Tool – RC1 – x86.

Rejestracji dokonujemy na stronie https://www.orcsweb.com/signup/?planid=46. Po wypełnieniu formularza otrzymamy maila z danymi potrzebnymi do wgrania naszej aplikacji na serwer oraz “connection string” do bazy danych.

Więcej informacji dostępnych jest na stronie: VS2010 and Web Deployment Tool Beta Program.

Intellisense dla jQuery i innych bibliotek javascript

W Visual Studio 2008 mamy możliwość korzystania z intellisense dla różnych bibliotek javascript. Aby jednak korzystać z tego dobrodziejstwa musimy:

Po instalacji tych elementów możemy korzystać z instellisense dla różnych bibliotek javascript. Oczywiście biblioteki te musimy zadeklarować na naszej stronie.

[sourcecode language=”xhtml”]

<script src="js/mylibrary.js" type="text/javascript"></script>

[/sourcecode]

Poza standardowym “podpowiadaniem” funkcji/metod/itp. dla bibliotek js, path ten umożliwia korzystanie również z dokumentacji. Dokumentację tworzymy pisząc komentarze podobne do komentarzy z C#, np.:

[sourcecode language=”xhtml”]

function TestFunction(imie) {
/// Przykładowa funkcja javascript
/// Pierwszy parametr funkcji
/// Wartość zwracana
return "test";
}
[/sourcecode]

JavaScript intellisense

Funkcjonalność patha jest bardzo przemyślana i umożliwia korzystanie z komentarzy umieszczonych w innym pliku niż nasza biblioteka.  Jak wiadomo, pliki javascript powinny być jak najmniejsze, a tworzenie w nich dokumentacji na pewno w tym nie pomaga :)

Kolejność przeszukiwania plików w poszukiwaniu dokumentacji wygląda tak:

  • mylibrary-vsdocs.js
  • mylibrary-debug.js
  • mylibrary.js

Jeżeli nie zostanie znaleziony plik mylibrary-vsdocs.js szukany jest mylibrary-debug.js, itd. Oczywiście deklarujemy tylko mylibrary.js – plik z dokumentacją powinien jednak znajdować się w tym samym katalogu (jednak nie musi być nawet includowany w projekcie).

JavaScript intellisense

Jeżeli deklaracja pliku js znajduje się innym pliku (np. w MasterPage), wtedy w naszym pliku musimy podać referencję:

[sourcecode language=”xhtml”]

/// <reference path="js/mylibrary.js" />

[/sourcecode]

lub

[sourcecode language=”xhtml”]

/// <reference path="Default.aspx" />

[/sourcecode]

Wszystkich, którzy piszą w jQuery z pewnością ucieszy fakt, iż od jakiegoś czasu przygotowywane są pliki z dokumentacją do tej biblioteki.

Dokumentację znaleźć można na stronie jQuery.

JavaScript intellisense