Mrz 192011
 

Vor kurzem wurde ich auf eine, irgend wie coole, Geschichte für ASP.NET Anwendungen aufmerksam via dem Blog von rtur.net.  Er zeigte wie man ELMAH sehr einfach in BlogEngine.NET einbauen kann. Mit ELMAH können sehr einfach Applikationsweite Exceptions, die nicht abgefangen sind, aufgezeichnet werden. Einfach die DLL ins bin-Verzeichnis kopieren und die web.config ein wenig anpassen und schon wird tüchtig aufgezeichnet.

Zudem seht noch ein HTTP Handler zur Verfügung, elmah.axd, womit eine Liste mit allen aufgetretenen Fehler zu sehen ist.

Liste mit allen Exceptions -- ELMAH

Die Exceptions können in etlichen Datenquellen abgelegt werden. Diverse Datenbanken, XML Dateien und auch per Mail verschickt werden.

Wie baut man nun ELMAH am einfachsten in BlogEngine.NET ein?

  1. Lade NuGet runter und installiere es, sofern NuGet noch nicht installiert ist.
  2. Öffne das BlogEngine.NET Projekt mit Visual Studio 2010 und klicke im Projektexplorer rechts mit der Maus. Gehe auf “Add Library Package Reference…”.
    Add Library Package Reference…
  3. Suche nach “ELMAH” und klicke auf “Install”.
    ELMAH installieren
    Danach sieht es so aus.
    ELMAH installiert
  4. Öffne die web.config und passe sie noch ein wenig an. Einiges wird schon ergänzt. Aber wenn die Exceptions per Mail verschickt werden sollen oder in eine Datenbank geschrieben werden sollen muss noch ein wenig etwas angepasst werden.
    Infos dazu sind hier zu finden. sample web.config für ELMAH.
  5. Lade die DLL’s ins bin-Verzeichnis und die angepasste web.config auf den Webserver. Das war alles.

Mein Ziel ist es nun, alle Exceptions, die sich so ansammeln, zu beheben. Keine Ahnung was da auf mich zukommt. Ich habe auch zur Sicherheit mal die Methode Application_Error in der global.asax ausgeschalten. Wenn ich mich nicht irre behandelt diese so ziemlich alle Exceptions die sonst nirgends behandelt wurden. Die möchte ich natürlich auch in der Liste der Exceptions haben.

Den EMail-Versand habe ich zwar parametrisiert, aber zu funktionieren scheint er zur Zeit nicht. Ich weiss noch nicht wo genau das Problem liegen könnte. Aber schauen wir mal.

Ach ja. Und das nicht jeder auf die elmah.axd zugreifen kann, kann man in der web.config die Sicherheit so einstellen damit nur der angemeldete Admin auf die Seite zugriff hat.

</configSections>

<location path="elmah.axd">
    <system.web>
        <authorization>
            <deny users="?"/>
        </authorization>
    </system.web>
</location>

...

Mein aktuelles privates Projekt – www.EdelsteinKreationen.ch

 Allerlei  Kommentare deaktiviert für Mein aktuelles privates Projekt – www.EdelsteinKreationen.ch
Feb 032010
 

Neben meinem Job habe ich noch ganz wenig Freizeit. 🙂 Diese Freizeit wird von Frau, Kinder und PC in Anspruch genommen. Meine Frau hat auch ein Hobby, seit einiger Zeit. Und jetzt, jetzt folgt der logische nächste Schritt. Sie will eine eigene Webseite. Was liegt da näher als den Ehemann zu fragen der ja Programmierer ist. Was soll ich da bloss sagen. 🙂

Jedenfalls gingen in den letzten paar Wochen etliche Stunden in das Projekt. Aber es macht Spass.

Meine Frau macht aus Edelsteinen Halsketten, Armketten, Bebehalsketten und noch ein paar andere nette Sachen. Ich bin ja nicht ein Schmuckfan, aber einige Sachen sehen echt gut aus. Bislang machte sie diese, wie wir sie nennen, EdelsteinKreationen für die Kinder, sich selbst, für Verwandte und Kolleginnen. Diese sind langsam aber sicher mit solchen Kunstwerken eingedeckt. Also, ab ins Web und versuchen die Kreationen zu verkaufen.

Ich darf also ein Web bauen mit einem kleinen Shop. Sehr einfach. Keine Kreditkarten oder so. Einfach per Mail. Ich wollte nicht das sie, meine Frau, alles irgend wie mit Expression Web oder so Pflegen muss. Dann wäre es ja eh bei mir hängen geblieben. Also suchte ich ein CMS. Fündig wurde ich bei N2 CMS. Das ist ein ASP.NET MVC Projekt. Es MUSSTE ein .NET CMS sein, vorzugsweise C#. So kann ich auch noch was lernen. Das Ergebnis ist unter www.EdelsteinKreationen.ch zu finden. Was mich noch am meisten erstaunte, die Domain war noch zu haben. Ich finde das eine absolut geniale Domain. Passt voll und ganz zum Thema.

Jetzt fehlen natürlich nur noch die Kunden. Aber das wird sich sicher noch geben. Vor zwei Tagen sagte ich meiner Frau, dass Google sicher mal wieder eine AdWords Kampagne starten wird und ich bekomme dann sicher wieder einen Gutschein. Was soll ich sagen. Heute kam ein solcher Gutschein über 125CHF mit der Post bei mir an. Was für ein Zufall. Das werde ich sicher noch nutzen.

Was sicher auch noch cool wäre ist so etwas wie virales Marketing. Hoffe der Begriff passt einigermasen. Es gibt immer wider Blogger die machen Wettbewerbe wenn man etwas dazu schreibt und einen Backlink auf ihr Blog setzt. Das gibt viele Backlinks und Google freut sich. Einen Wettbewerb kann ich nicht machen. Einen Preis in dem Sinn kann ich nicht zur Verfügung stellen.

Aber einen Backlink schon. 😀

Also. Wer etwas über www.EdelsteinKreationen.ch schreibt und es mir mitteilt, dem setze ich einen Backlink. Genau am Ende dieses Postings. Wie so sollte man das machen? Jetzt muss ich ein wenig prahlen. <prahlen> Backlink von einer Seite mit PR4!! Wisst ihr was das Wert hat?! 22Euro im Monat. Und der Link bleibt immer drin. Das kann also ein sehr guter Gewinn sein. 😀 </prahlen>

Wenn sich jemand also darauf einlässt, dann ein Kommentar auf dem Posting hinterlassen. Dann setzte ich den Link. Natürlich ohne nofollow. Ist ja klar. 😀

Google wird’s freuen.

Jun 162009
 

Seit kurzem gibt es bei mir im Blog oben Rechts den Hinweis wie viele Besucher zur Zeit bei mir Online sind. Das Ding ist aber sehr einfach gestrickt, sollte aber relativ genau sein. Wer mehr Hintergrundwissen haben möchte kann sich bei Klaus Bock dieses Posting ansehen.

Klaus geht noch weiter. Er registriert ein Java Script auf dem Client das beim schliessen des Browsers noch eine Seite aufruft die nichts anderes macht als die Session auf dem Server zu beenden. Aber spätestens nach 20 Minuten wird die Session auf dem Server so oder so mit Session_End beendet.

Die Implementation in BlogEngine.NET, kurz BE, läuft in etwa wie folgt ab.

Bei BE sind die Sessions standardmässig ausgeschaltet. Ich habe sie einfach in der Web.config wieder eingeschaltet. 

<sessionState mode="InProc" cookieName=".geniali.ch"/>

Als nächstes muss noch bemerkt werden wann eine neue Session startet und wann eine Session beendet wird. Dazu gibt es in ASP.NET zwei Events die man in der Datei global.asax implementieren muss. Bei BE sind die Zwei noch nicht drin.

void Session_Start(object sender, EventArgs e)
{
    // User-Zähler erhöhen.  
    Application.Lock();
    Application["Viewers"] = (int)Application["Viewers"] + 1;
    Application.UnLock();
}

void Session_End(object sender, EventArgs e)
{
    // User-Zähler verringern.  
    Application.Lock();
    if((int)Application["Viewers"] > 0)
    {
        Application["Viewers"] = (int)Application["Viewers"] - 1;
    }
    Application.UnLock();
}

Das Application["Viewers"] Objekt muss aber zuerst noch initialisiert werden. Zudem muss auch sichergestellt sein das beim Start des Webs diese Variable auch wieder auf 0 gestellt wird. Dies macht man im Event Application_Start.

void Application_Start(object sender, EventArgs e)
{
    // Schlüssel Viewers in der Anwendung erzeugen
    Application["Viewers"] = 0;
		...

Danach muss nur noch sicher gestellt werden das die “Viewers” auch angezeigt werden. Dazu erstellt man ein neues UserControl. Ich habe das UserControl unter meinem Theme im Ordner Controls abgelegt.

UserOnline.ascx

<%@ Control Language="C#"
 AutoEventWireup="true" 
CodeFile="UserOnline.ascx.cs" 
Inherits="themes_GENiALi_Controls_UserOnline" %>
<asp:Literal ID="litUsers" runat="server"></asp:Literal>

UserOnline.ascx.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class themes_GENiALi_Controls_UserOnline 
	: System.Web.UI.UserControl
{
	protected void Page_Load(object sender, EventArgs e)
	{
		litUsers.Text = Application["Viewers"].ToString() 
			+ " Besucher online";
	}
}

Das UserControl kann man einfach auf die site.master des Theme ziehen und dort platzieren. Mit CSS kann die Anzeige noch formatiert und ausgerichtet werden.

Unter dem Strich sollte es in etwa so aussehen. 🙂

8 Besucher Online

kick it on dotnet-kicks.de

ASP.NET – MaxRequestLength auf der Webseite anzeigen

 Entwicklung  Kommentare deaktiviert für ASP.NET – MaxRequestLength auf der Webseite anzeigen
Mai 272009
 

Ich schraube zur Zeit an einer Anwendung rum die einem die Möglichkeit gibt Dateien hoch zu laden. Diese werden dann in einem SQL Server gespeichert.

Standardmässig begrenzt ASP.NET die Dateigrösse auf 4 MB (4096 KB). Das kann man mit diesem Eintrag hier ändern.

[...]
<system.web>
    <!-- Uploadgrösse anpassen. Standart ist etwa 4 MB in KB (4MB = 4096KB)-->
    <httpRuntime maxRequestLength="8192" />
[...]

Es macht deshalb auch Sinn das man die User über die maximale Grösse der Datei infomiert. Ich will also anzeigen wie gross eine Datei sein darf. Ich will aber nicht bei jeder Änderung des Wertes das HTML anpassen müssen. Also muss es im Code machbar sein.

Zum Beispiel so:

Configuration config = WebConfigurationManager.OpenWebConfiguration("~");
HttpRuntimeSection section = config.GetSection("system.web/httpRuntime") as HttpRuntimeSection;
double maxFileSize = Math.Round(section.MaxRequestLength / 1024.0, 1);

labFileSize.Text = string.Format("{0:0.#} MB", maxFileSize);

Wenn es noch einfacher geht lasst es mich wissen.

kick it on dotnet-kicks.de

Mrz 172009
 

ASP.NET ist einfach noch nicht so meine Welt. Das muss ich immer mal wieder merken.

Gerade vorhin. Ich habe ein GridView an das ich ein Objekt binde. Das Objekt hat einige Eigenschaften vom Typ DateTime. Diese Eigenschaften können mit DateTime.MinValue vorbelegt sein. Das sieht dann aber ziemlich blöde aus im GridView.

image

Ich dachte es gibt sicher eine Eigenschaft wo man das beim GridView einstellen kann. Na ja, es gibt die nicht. Lösen kann man es wie folgt.

Aus dem Feld ein ItemTemplate machen und mit einem if prüfen ob es ein DateTime.MinValue ist. Sieht dann so aus.

<ItemTemplate>
    <asp:Label ID="Label1" 
    runat="server" 
    Text='<%# ((DateTime)Eval("DateFrom")) == DateTime.MinValue ? "--.--.----" : Eval("DateFrom",  "{0:d}") %>'>
    </asp:Label>
</ItemTemplate>

Ergebnis:

image

Tausend dank geht an Thomas.

GENiALi’s Blog war lange offline

 Allerlei, Entwicklung  Kommentare deaktiviert für GENiALi’s Blog war lange offline
Aug 052008
 

Wie einige von euch sicher bemerkt haben, jedenfalls habe ich es bemerkt,
war mein Blog, meine Blogs, heute sehr lange offline. Eigentlich seit
gestern 19.00Unr bis Heute ca. 17.00Uhr.

Ich wusste, dass ich gestern nichts gemacht habe. Jedenfalls denke ich das.
Also war ich mir ganz sicher, dass es am Server liegen muss. Entsprechend
habe ich meinem Hoster geschrieben und wurde langsam aber sicher
nervös. Der freundliche Herr auf der anderen Seite hat dann mal den AppPool
neu gestartet, aber das Web war sofort wieder down.

Da hatte ich schon ein Déjà-vu. So ähnlich fingen die Probleme beim alten
Hoster an.

Nach der Arbeit eilte ich schnell nach Hause. Ich wollte dem Problem auf die
Spur kommen. Ich wusste, ich müsste eigentlich nur an die Eventlog’s des Server’s
kommen. Dann wüsste ich schnell was los wäre. Aber welcher SharedHoster lässt
das schon zu.

Ich versuchte es aber trotzdem. Ich nutzte eine Subdomain wo ich Änderungen an meinem Blog
teste. Dort habe ich alles gelöscht. Ich baute mir eine kleine Webseite die mir
das Eventlog ausliest, einwenig filtert und nach dem Datum sortiert.

Zu meiner Überraschung klappte das sogar. Ich konnte das Eventlog auslesen.
Allerdings war ich überrascht was den Schuldigen anbelangt. Das war ich selber. 🙂

Log

Irgend wie habe ich am Testblog etwas geändert. Ich weiss einfach nicht
was und wann.

Und wie liest man nun das Eventlog aus? Hier einwenig Code.

default.aspx (aber nicht komplett)

<div>
        <asp:DropDownList ID="ddlLog" runat="server">
            <asp:ListItem>Application</asp:ListItem>
            <asp:ListItem>System</asp:ListItem>
        </asp:DropDownList>
        <asp:CheckBox ID="cboError" runat="server" Checked="True" Text="Error" />
        <asp:CheckBox ID="cboWarning" runat="server" Checked="True" Text="Warning" />
        <asp:CheckBox ID="cboInformation" runat="server" Checked="True" 
            Text="Information" />
        <asp:CheckBox ID="cboSuccessAudit" runat="server" Checked="True" 
            Text="SuccessAudit" />
        <asp:CheckBox ID="cboFailureAudit" runat="server" Checked="True" 
            Text="FailureAudit" />
        <br />
        <asp:Label ID="Label1" runat="server" Text="Items: "></asp:Label>
        <asp:TextBox ID="tbItems" runat="server">250</asp:TextBox>
        <br />
        <asp:Button ID="cmdLoad" runat="server" onclick="cmdLoad_Click" Text="load" 
            Width="108px" />
        <br />
        <asp:Label ID="labError" runat="server" Text=""></asp:Label>
        <asp:GridView ID="dg" runat="server" BackColor="LightGoldenrodYellow" 
            BorderColor="Tan" BorderWidth="1px" CellPadding="2" ForeColor="Black" 
            GridLines="None">
            <FooterStyle BackColor="Tan" />
            <PagerStyle BackColor="PaleGoldenrod" ForeColor="DarkSlateBlue" 
                HorizontalAlign="Center" />
            <SelectedRowStyle BackColor="DarkSlateBlue" ForeColor="GhostWhite" />
            <HeaderStyle BackColor="Tan" Font-Bold="True" />
            <AlternatingRowStyle BackColor="PaleGoldenrod" />
        </asp:GridView>
    </div>

default.aspx.cs (auch nur das Wichtigste)

protected void Page_Load(object sender, EventArgs e)
{
}

protected void cmdLoad_Click(object sender, EventArgs e)
{
	EventLog el = null;

	//Hier kommen alle Events rein damit sie sortiert werden können.
	List<EventLogEntry> entrys = new List<EventLogEntry>();

	try
	{
		//Das Eventlog laden das selektiert ist.
		el = new EventLog(ddlLog.SelectedValue);

		foreach (EventLogEntry entry in el.Entries)
		{
			if ((cboError.Checked) && 
				(entry.EntryType == EventLogEntryType.Error))
			{
				entrys.Add(entry);
			}

			if ((cboWarning.Checked) && 
				(entry.EntryType == EventLogEntryType.Warning))
			{
				entrys.Add(entry);
			}

			if ((cboInformation.Checked) && 
				(entry.EntryType == EventLogEntryType.Information))
			{
				entrys.Add(entry);
			}

			if ((cboSuccessAudit.Checked) && 
				(entry.EntryType == EventLogEntryType.SuccessAudit))
			{
				entrys.Add(entry);
			}

			if ((cboFailureAudit.Checked) && 
				(entry.EntryType == EventLogEntryType.FailureAudit))
			{
				entrys.Add(entry);
			}
		}

		//Die Logs nach Datum sortieren.
		entrys.Sort(EntrySorter);

		//Die Eventlog Einträge an ein DataGrid binden.
		dg.DataSource = entrys.GetRange(0, 
			entrys.Count > int.Parse(tbItems.Text) ? 
			int.Parse(tbItems.Text) : entrys.Count - 1);
		this.DataBind();
	}
	catch (Exception ex)
	{
		labError.Text = ex.ToString();
	}
	finally
	{
		el.Close();
	}
}

//Sortiert nach dem Datum
private static int EntrySorter(EventLogEntry x, EventLogEntry y)
{
	return y.TimeWritten.CompareTo(x.TimeWritten);
}

Der Code ist nicht über alles erhaben. Aber er tut. Das sieht dann etwa so aus.

So sieht das Ergebnis aus.

Das dürfte aber noch lange nicht überall funktionieren. Ich gehe mal davon aus

das die meisten SharedHoster das nicht erlauben.

DataGrid – Zeile gem. einer Bedingung einfärben

 Entwicklung  Kommentare deaktiviert für DataGrid – Zeile gem. einer Bedingung einfärben
Okt 112006
 

Ich wollte bei einem DataGrid die Zeilen rot einfärben die eine gewisse
Bedingung erfüllen.
Das kann man gut im ItemCreated Event des DataGrid machen.

Da ich ein ArrayList mit einem eigenen Typ dran gebunden habe
komme ich auch einfach an die Infos.

Die Methode sieht etwa so aus.

private void Interviews_ItemCreated(object sender, DataGridItemEventArgs e)
{
     
if(e.Item.ItemType == ListItemType.Item)
     {
          ListCall call = e.Item.DataItem 
as ListCall;

          if(call.IsRed)
          {
               e.Item.BackColor = Color.Red;
          }
     }
}

Funktioniert so weit so gut. Es gab aber immer mal wieder Zeilen
wo es nicht griff. Nach einigem Suchen viel mir dann auf, dass
es noch ein ListItemType.AlternatingItem gibt. Genau die fehlenden waren
von diesem Typ. Das kommt daher, weil ich ein AlternatingItemStyle definiert
habe.

So klappt es.

private void Interviews_ItemCreated(object sender, DataGridItemEventArgs e)
{
     
if((e.Item.ItemType == ListItemType.Item) || (e.Item.ItemType == ListItemType.AlternatingItem))
     {
          ListCall call = e.Item.DataItem 
as ListCall;

          if(call.IsRed)
          {
               e.Item.BackColor = Color.Red;
          }
     }
}

dasBlog – Trackback’s können nicht gelöscht werden

 Allerlei, Entwicklung, Software  Kommentare deaktiviert für dasBlog – Trackback’s können nicht gelöscht werden
Sep 272006
 

Ich habe es schon mal kurz erwähnt. Im dasBlog gibt es immer wieder
Trackback’s die nicht gelöscht werden können. Ich dachte damals, komm
warte auf die neue Version. Allerdings gibt es bei der 1.9’er Version
das Problem noch immer. Es sind die selben Trackback’s die man nicht
löschen kann.

Heute habe ich mich einmal daran versucht das Problem zu lösen.
Sie da, ich hab’s gefunden. Jedenfalls denke ich das. 🙂

Problem:

Der Methode, die die Trackback’s löschen soll, wird z.B.: folgende URL
übergeben.

trackingPermalink -> „h**p://SPAM_DOMAIN/1phentermine/cheap-phentermine-online.html“

dasBlog geht jetzt alle Referrer und Trackback’s des Posting durch und
sucht den entsprechenden Eintrag. Der wird jetzt aber nicht gefunden
weil er in der Collection wie folgt drin ist.

tracking.PermaLink -> „h**p://SPAM_DOMAIN/1phentermine/cheap-phentermine-online.html\r“

Wichtig ist das \r am Ende.

Der Vergleich

String.Compare(tracking.PermaLink, trackingPermalink, true)

muss so also scheitern. Leider.

Lösung:

Das ganze ist in der Datei BlogDataService.cs zu finden, in der Methode

BlogDataService.DeleteTracking.

 

So naiv ich jetzt bin, habe ich einfach vor der Prüfung ob die URL auch
übereinstimmt, noch ein Check eingebaut, der mir Prüft ob die URL auf
ein \r endet.

 

int badString = tracking.PermaLink.IndexOf(„\r“);

if(badString > -1)
{
    tracking.PermaLink = tracking.PermaLink.Remove(badString);
}

if(String.Compare(tracking.PermaLink, trackingPermalink, true) == 0 
   && trackingType == tracking.TrackingType)
{

 

Ob ich es richtig gelöst habe wird sich noch Zeigen. Wenn nicht, dann lasst
es mich wissen.

"Web Application Projects" auf DE Systemen installieren

 Allerlei, Entwicklung, Software  Kommentare deaktiviert für "Web Application Projects" auf DE Systemen installieren
Aug 242006
 

Eigentlich wollte ich nur dasBlog
mit Visual Studio 2005 kompilieren. Dazu gibt es
auf dem Blog zum dasBlog eine Anleitung was man
zu erledigen hat.

Punkt 4 und 5 sind Updates für Visual Studio 2005
die einem den Support für „Web Application Projects“
zur Verfügung stellen.

Blöd ist jetzt, dass ich alles in deutscher Sprache installiert
habe. Zumindest die Software zum „Web Application Projects“ wollte
sich nicht installieren lassen.

Es soll aber angeblich einen Workaround (Punkt 9) geben wie man das Update
auf nicht EN Installationen bringt. Toll. Ich habe aber am besagten Ort
kein „Englisch“ zur Auswahl.

In einem Forum wurde ich dann aber fündig.
Installiere einfach die englische Version von Visual Studio darüber.
Toll, dachte ich.

Aber da ich ein Universal MSDN Abo habe ist das ja kein Problem.
Gedacht getan… Es klappt. Danach gibt es bei den „Internationalen Einstellungen“
die Sprache „Englisch“. Das Update lässt sich auch installieren.
Zudem sieht im Visual Studio 2005 noch alles nach DE aus. 🙂

Was mich erstaunt. Das Update für den Web Application Project Support
gibt es Final seid dem 21.3.2006, aber eine lokalisierte Version finde ich noch
immer nicht.

Ob ich allerdings dasBlog jetzt auch erfolgreich kompilieren kann weiss ich noch nicht.
Habe das Update erst im Büro gemacht. Zuhause noch nicht.

Aug 182006
 

Ich habe mir wieder mal zwei neue Fachbücher besorgt.
Kam in letzter Zeit nicht mehr ganz so oft vor.

Thema ist ASP.NET 2.0 und Winforms mit Visual C# 2005.
Grund: Meine Webseite läuft jetzt unter ASP.NET 2.0 und
das Coole Tool LiveWriter kann ich auch mit dem 2.0’er Framework
gebrauchen. Jetzt steht dem Umstieg nichts mehr im Weg.

Beim ASP.NET 2.0 Buch hätte ich aber wahrscheinlich zuerst
die einfachere Version nehmen sollen.

Gemäss der Einleitung hat Dino Esposito ein Buch über 1600 Seiten gemacht. Das ist nicht ganz so handlich wie man es sich vorstellt. Deshalb wurde es in zwei Teile aufgeteilt. Im ersten Teil geht es um Klassischen ASP.NET 2.0. In diesem Teil geht es vielfach um die Interna der 2’er Version. Deshalb vermute ich, dass das nicht ganz das Richtige für mich ist.

Allerdings finde ich den Teil 1 nicht. Wer den kennt soll es mir doch bitte mitteilen.

Zu dem Teil kann ich noch nichts sagen. Ich habe beim lesen mit dem ASP.NET 2.0 Buch begonnen. Aber über kurz oder lang wird auch dieses Buch gelesen. Dann mehr dazu.