iSven

Unwichtiges nach Relevanz sortieren...

Kommentarheader für ASP.NET Seiten mit Subversion Keywords

Subversion unterstützt das Ersetzen von Keywords im Sourcecode. Hierzu müssen für die jeweiligen Dateien die entscheidenen Properties gesetzt werden. Beispiel: HeadURL LastChangedBy LastChangedRevision LastChangedDate

In C# Dateien sieht dann ein Kommentarheader folgendermaßen aus:

//===============================================================================
// $HeadURL$
// $LastChangedBy$
// $LastChangedRevision$
// $LastChangedDate$
// Copyright   : 2006-2007, ITDevCon Germany
// Autor       : Sven Soennichsen
// Beschreibung: Ausführliche Beschreibung
//===============================================================================


In ASPX Dateien empfiehlt sich folgendes Format:

<%--
  //===============================================================================
  // $HeadURL$
  // $LastChangedBy$
  // $LastChangedRevision$
  // $LastChangedDate$
  // Copyright   : 2006-2007, ITDevCon Germany
  // Autor       : Sven Soennichsen
  // Beschreibung: Ausführliche Beschreibung

  //===============================================================================
--%>

Subversion ersetzt dann beim Commit die Keywords mit den tatsächlichen Tatbeständen.

Nachtrag zum .NET Usergroup Treffen in HH

Hier ein kleiner Nachtrag zum .NET Usergroup Treffen in Hamburg, das jeden ersten Mittwoch im Montag im Irish Pub im Fischhafen stattfindet:

Thema war die Windows Workflow Foundation (WF), welche Bestandteil von .NET 3.0 ist. Da das Thema sich nicht gleich vollständig bei einem Gläschen Bier erschließt, hier einige Links, die weiterführende Infos enthalten:

  1. Die Powerpoint Folien zum Vortrag von Sebastian Weber gibt es hier.
  2. Super kleine Webcasts zum Thema WF gibt es unter wf.netfx3.com. Einfach unter Samples/Information/Screencasts die entsprechenden Dateien runterladen. Jeder Webcast dauert zwischen 10 und 15 Minuten und führt ideal in die Windows Workflow Foundation ein.
  3. Das Windows SDK for Vista and .NET 3.0 enthält viele Samples und die Dokumentation zu WF.
  4. Zur Entwicklung von Workflows braucht man den graphischen Designer als Visual Studio Extension.

Viel Spaß in der neuen Welt der Workflows!

Übrigens, beim nächsten Usertreffen am 7.3.2007 werden wir nochmals das Thema Workflow Foundation behandeln. Vielleicht bringen ja mal einige Sharepoint Entwickler Ihr Notebook mit und erzählen von Ihren Erfahrungen...

Howto: Verwenden von log4net in ASP.NET Webanwendungen

Hier ein Kurzleitfaden, um log4net in ASP.NET Webanwendungen zu verwenden:

1. Einträge in der Web.config vornehmen:<!-- code formatted by http://manoli.net/csharpformat/ -->

<style type="text/css">
.csharpcode, .csharpcode pre
{
    font-size: small;
    color: black;
    font-family: Consolas, "Courier New", Courier, Monospace;
    background-color: #ffffff;
    /*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #006080; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt
{
    background-color: #f4f4f4;
    width: 100%;
    margin: 0em;
}

.csharpcode .lnum { color: #606060; }
</style>
<pre class="csharpcode">
<span class="kwrd">&lt;</span><span class="html">configSections</span><span class="kwrd">&gt;</span>
  <span class="kwrd">&lt;</span><span class="html">section</span> <span class="attr">name</span><span class="kwrd">="log4net"</span>
      <span class="attr">type</span><span class="kwrd">="log4net.Config.Log4NetConfigurationSectionHandler, log4net"</span><span class="kwrd">/&gt;</span>
<span class="kwrd">&lt;/</span><span class="html">configSections</span><span class="kwrd">&gt;</span>

<span class="kwrd">&lt;</span><span class="html">log4net</span><span class="kwrd">&gt;</span>
  <span class="kwrd">&lt;</span><span class="html">root</span><span class="kwrd">&gt;</span>
    <span class="kwrd">&lt;</span><span class="html">level</span> <span class="attr">value</span><span class="kwrd">="DEBUG"</span><span class="kwrd">/&gt;</span>
    <span class="kwrd">&lt;</span><span class="html">appender-ref</span> <span class="attr">ref</span><span class="kwrd">="FileAppender"</span><span class="kwrd">/&gt;</span>
  <span class="kwrd">&lt;/</span><span class="html">root</span><span class="kwrd">&gt;</span>
  <span class="kwrd">&lt;</span><span class="html">appender</span> <span class="attr">name</span><span class="kwrd">="FileAppender"</span> <span class="attr">type</span><span class="kwrd">="log4net.Appender.FileAppender"</span><span class="kwrd">&gt;</span>
    <span class="kwrd">&lt;</span><span class="html">file</span> <span class="attr">value</span><span class="kwrd">="log/log-file.txt"</span><span class="kwrd">/&gt;</span>
    <span class="kwrd">&lt;</span><span class="html">appendToFile</span> <span class="attr">value</span><span class="kwrd">="true"</span><span class="kwrd">/&gt;</span>
    <span class="kwrd">&lt;</span><span class="html">layout</span> <span class="attr">type</span><span class="kwrd">="log4net.Layout.PatternLayout"</span><span class="kwrd">&gt;</span>
      <span class="kwrd">&lt;</span><span class="html">conversionPattern</span> <span class="attr">value</span><span class="kwrd">="%d{dd.MM.yy HH:mm:ss} %-5p %c %m%n"</span><span class="kwrd">/&gt;</span>
    <span class="kwrd">&lt;/</span><span class="html">layout</span><span class="kwrd">&gt;</span>
  <span class="kwrd">&lt;/</span><span class="html">appender</span><span class="kwrd">&gt;</span>
<span class="kwrd">&lt;/</span><span class="html">log4net</span><span class="kwrd">&gt;</span></pre>

2. In der Global.cs (Global.asax) im Application_Start Event log4net initialisieren:<!-- code formatted by http://manoli.net/csharpformat/ -->

<style type="text/css">
.csharpcode, .csharpcode pre
{
    font-size: small;
    color: black;
    font-family: Consolas, "Courier New", Courier, Monospace;
    background-color: #ffffff;
    /*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #006080; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt
{
    background-color: #f4f4f4;
    width: 100%;
    margin: 0em;
}

.csharpcode .lnum { color: #606060; }
</style>
<pre class="csharpcode">
log4net.config.xmlconfigurator.configure()</pre>

3. Verwenden des Loggers durch eine statische Variable in jeder Klasse:<!-- code formatted by http://manoli.net/csharpformat/ -->

<style type="text/css">
.csharpcode, .csharpcode pre
{
    font-size: small;
    color: black;
    font-family: Consolas, "Courier New", Courier, Monospace;
    background-color: #ffffff;
    /*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #006080; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt
{
    background-color: #f4f4f4;
    width: 100%;
    margin: 0em;
}

.csharpcode .lnum { color: #606060; }
</style>
<pre class="csharpcode">
<span class="kwrd">private</span> <span class="kwrd">static</span> <span class="kwrd">readonly</span> ILog log = LogManager.GetLogger(<span class="kwrd">typeof</span>(Classname));</pre>

4. Anschliessend kann der Logger in der Klasse verwendet werden:<!-- code formatted by http://manoli.net/csharpformat/ -->

<style type="text/css">
.csharpcode, .csharpcode pre
{
    font-size: small;
    color: black;
    font-family: Consolas, "Courier New", Courier, Monospace;
    background-color: #ffffff;
    /*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #006080; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt
{
    background-color: #f4f4f4;
    width: 100%;
    margin: 0em;
}

.csharpcode .lnum { color: #606060; }
</style>
<pre class="csharpcode">
log.Debug(<span class="kwrd">string</span>.Format(<span class="str">"LogMeldung {0}"</span>, varname))</pre>

Wer knabbert an meinem Häuschen...

Eigentlich ist der Process Explorer von Sysinternals, die ja mittlerweile von Microsoft übernommen worden sind, nichts Neues.  Trotzdem sollte dieses Tool nicht unerwähnt bleiben für Alle, die ein wenig mehr wissen wollen, als der Taskmanager von Windows preisgibt.


Angezeigt wird z.B. nicht nur der aktuelle Zustand der CPU Auslastung, sondern auch welcher Prozess in der Vergangenheit die höchste Prozessorlast erzeugt hat. Dazu fährt man einfach mit der Maus über die Zeitleiste der CPU Darstellung und neben dem Mauszeiger wird der entsprechende Prozess angezeigt. Dasselbe gilt auch für I/O Zugriffe. Damit bekommt man recht schnell raus, welcher Prozess immer wieder die Kontrolle über den Rechner übernimmt.


Die Baumansicht des Process Explorers mag auf den ersten Blick ein wenig unüberischtlich wirken. Doch nach kurzer Gewöhnungszeit ist diese Ansicht eigentlich unverzichtbar, denn es werden genaue Details über alle Prozess und deren Threads angezeigt. Allein beim herüberfahren mit der Maus werden schon wichtige Infos angezeigt und ein Doppelklick auf einen Prozess bringt eine detailierte Ansicht aller wichtiger Parameter.

Fazit: Der Process Explorer kann sehr gut unterstützen, wenn man in die Prozessinternas von Windows blicken will.

.NET 3.0 ist da!

Nach vielen CTP's und 2 Betas ist die Version Nummer 3 des .NET Frameworks released worden. Allerdings hat sich bei den bestehenden .NET Komponenten nichts geändert, sondern es sind lediglich neue aber sehr interessante Komponenten hinzugekommen:
  • Windows Presentation Foundation
  • Windows Communication Foundation
  • Windows Workflow Foundation
Insofern wäre die Versionsnummer 2.5 für das Framework eigentlich eher angebracht gewesen, denn bei den Sprachelementen bleibt alles wie gehabt.

Mehr Infos und Links zum Download

Kommunikation zwischen eigenen User Controls in ASP.NET

Als ein ganz wichtiges Mittel zur Kapselung von immer wiederkehrenden Bestandteilen bei ASP.NET Webanwendugen existieren User Controls. Im Gegensatz zu Custom Controls lassen sich User Controls recht schnell und einfach innerhalb einer Anwendung erstellen, können aber nicht wie Custom Controls in anderen Anwendungen weiterverwendet werden.
Prinzipiell sollte man User Controls immer als eigenständige Einheit ohne Abhängkeiten zu anderen Controls oder Seiten entwickeln. Was aber, wenn man einem anderen User Control ein Ereignis senden will bzw. eine Methode aufrufen will? Beispiel: ein User Control für eine Statuszeile. Andere User Controls sollen dem Statuszeilencontrol den aktuellen Zustand mitteilen. Beispielsweise, daß Daten erfolgreich geladen oder aktualisert worden sind. Diese Infos gehören eigentlich zum guten Stil, denn in Zeiten von Ajax kann der User nicht mehr anhand des fehlenden Flackerns beim Postback erkennen, ob eine Aktion nun ausgeführt worden ist oder nicht.

Zum Senden einer Nachricht an so ein Statuszeilecontrol bedarf es erst einmal einer Klasse zur Aufnahme der Argumente:

public class StatusMessageEventArgs : EventArgs{
  private string _message;
  private int _type;

  public enum Types {
    Info,
    Error
  }

  public String Message {
    get {
            return _message;
         }
    set {
            _message = value;
         }
  }

  public Types Type {
    get {
            return (Types)_type;
         }
    set {
            _type = (int)value;
         }
    }
}


Hier wird einerseits eine Message als String übergeben, als auch der Typ der Message: Info oder Error.
Als nächstes benötigen wir eine öffentliche Methode in dem Statuszeilencontrol, dass die Nachricht empfangen und verarbeiten soll:

public void HandleStatusMessageEvent(object sender, StatusMessageEventArgs e) {
  if (e.Type == StatusMessageEventArgs.Types.Info) {
    this.TextInfo = e.Message;
  }
  else {
    this.TextError = e.Message;
  }
}


This.TextInfo und this.TextError sind nur weitere private Properties, die die Statuszeile entsprechend aktualiseren.
Im User Control, daß eine Nachricht an das Statuszeilencontrol senden will, muß ein Eventhandler definiert werden:

public event EventHandler<StatusMessageEventArgs> OnSendStatusMessage;

Dieser Eventhandler kann dann entsprechend im User Control aufgerufen werden:

if (OnSendStatusMessage != null) {
  StatusMessageEventArgs message = new StatusMessageEventArgs();
  message.Type = StatusMessageEventArgs.Types.Info;
  message.Message = "Daten sind aktualisert worden";
  OnSendStatusMessage(this, message);
}

Letztendlich muss dann auf der Seite, die die beiden User Controls enthält eine Verknüpfung zwischen Eventhandler und der Methode hergestellt werden:

this.MyUserControl.OnSendStatusMessage += new
EventHandler<StatusMessageEventArgs> (this.StatusControl.HandleStatusMessageEvent);

Das war's! Durch diese recht lose Kopplung können User Controls miteinander kommunizieren. Die Aufgabe der Verknüpfung der Controls übernimmt dann immer die Seite, in die die User Controls aufgenommen werden.