- Posted by robert on Mai 28, 2009
Dieser Post folgt der MSDN Blogparade ohne große Überraschungen:
- 1:) Resharper (Liebe, Ruhm und Lob an Resharper!)
- 2:) Visual Studio 2008 (Solide Resharper Platform)
- 3:) VisualSvn (Das treue Arbeitspferd, das auf die Schildkröte setzt)
(Nun lieber Postmann bring die X-BOX! :-)
- Posted by robert on Mai 28, 2009
Schade das der MS-SqlServer von Hause aus nicht syntaktisch schönere Abfragen unterstützt. Insbesondere CAST ist umständlich und Beispielsweise die DATETIME Funktionen weder bequem noch besonders vollständig.
Ich wünsche mir IntelliSense-freundliche Syntax, die Spalten/Projektionen als Objekt auffasst und Typabhängig eine Reihe von Funktionen zulässt:
SELECT * FROM SomeTable
WHERE Name.StartsWith(‘a’)
Hier das ganze in gültigem SQL
SELECT * FROM SomeTable
WHERE Name like 'a%'
oder
SELECT * FROM SomeTable
WHERE SUBSTRING(Name, 0, 1 ) = SUBSTRING ( 'a', 0, 1)
- Posted by robert on Mai 20, 2009
Der neue ASP.NET Toolkit HTML Editor macht einen guten Eindruck.

Auf den zweiten Blick fehlt jedoch die Möglichkeit Bilder einzufügen. Sucht man ein wenig weiter, findet man im Release Note eine Danksagung an die Firma Obout die anscheinend offensichtlich den HTML Editor beigesteuert hat. Die kommerzielle Version des Editors unterstützt das Einsetzen von Bildern und Bilduploads. Der Obout-Editor kostet zwischen $99 und $289. Kostenlose Alternativen bleiben TineMCE, FCKEditor
Editor Alternativen
Weitere Links:
- Posted by robert on Mai 14, 2009
Für Webentwickler ist das Auswerten und Setzen von Cookies Business-Logik und Business Logik sollte Testgetrieben entwickelt werden.
Hier ein Beispiel Unit-Test:
Response _response { get { return _httpCurrent.Response as ResponseNoWeb; } }
RequestNoWeb _request { get { return _httpCurrent.Request as RequestNoWeb; } }
[Test]
public void SetCookie()
{
_request.Url = new Uri("http://de.camping.info");
_uiLanguageService.SetLanguageCookie("de");
Assert.That(_response.CookiesCreated[0].Value, Is.EqualTo("de"));
Assert.That(_response.CookiesCreated[0].Name, Is.EqualTo("Lang"));
Assert.That(_response.CookiesCreated[0].Domain, Is.EqualTo(".camping.info"));
}
Ermöglicht wird das über die Abstrakton von HttpRequest und HttpResponse. (Die Entwicklung wurde gestern begonnen, der
Quelltext kapselt daher nur das Grundlegenste.)
Erfolgt die Anwendung nicht im Webkontext verwenden wir eine Implementierung für den lokalen Gebrauch:
namespace SpeakFriend.Utilities.Web
{
public class ResponseNoWeb : Response, IResponse
{
public void Redirect(string url)
{
_redirections.Add(url);
}
public void Redirect(string url, bool endResponse)
{
_redirections.Add(url);
}
public void SetCookie(HttpCookie cookie)
{
_cookiesCreated.Add(cookie);
}
}
}
…rudimentär, aber wirksam.
- Posted by robert on Mai 14, 2009
In unseren Projekten haben wir bisher mit fast historischen NUnit Versionen gearbeitet. Hier eine paar Beispiele:
- camping.info NUnit Version: 2.4.3 (Released August 2007)
- concept-web NUnit Version: 2.4.6 (Released December 2007)
- speak-lib NUnit Version, wie bei concept-web: 2.4.6
Heute habe ich alle unsere Projekte auf 2.5.0.9 aktualisiert. Die Liste der neuen Features lädt ein zum Experimentieren: Ten Reasons to Try NUnit 2,5.
- Posted by robert on Mai 14, 2009
Nachdem die Webseite nun im IIS eingerichtet ist, soll Sie natürlich auch gestartert werden:
$website = Get-WmiObject -Namespace "root/WebAdministration" -Class Site | Where-Object { $_.Name -eq $iis_app_name }
$website.Start()
(Analog dazu funktioniert natürlich auch $website.Stop())
- Posted by robert on Mai 10, 2009
Nun geht es darum die kopierte Webseite auch im IIS einzurichten. Da der redundante Server auf EC2 noch als Windows 2003 Maschine läuft muss das Script sowohl IIS6 als IIS7 unterstützen. (Ob durch Azure, EC2 niemals von Hause aus Windows 2008 Instanzen unterstützen wird?). Duch die benötigte Rückwertskompatibilität setzen wir daher WMI ein.
function IISCreateWebSite
{
$service = Get-WmiObject -namespace "root\MicrosoftIISv2" -class "IIsWebService"
$bindingClass = [wmiclass]'root\MicrosoftIISv2:ServerBinding'
$bindings = $bindingClass.CreateInstance()
$bindings.IP = ""
$bindings.Port = "80"
$bindings.Hostname = $iis_app_hostheader
$result = $service.CreateNewSite($iis_app_name, $bindings, $path_targetDeployment)
}
Die Umsetzung war verblüffend einfach und in 10 Minuten geschafft (Dank GBP “Google Based Programming”). Die Variablen sind nach bester Programmierermanier global.
- Posted by robert on Mai 8, 2009
Für eine Reihe von Ordnern benötigt der IIS User Schreibrechte. Hierfür verwenden wir eine Datei “user-rights.template”, die die entsprechenden Rechte erhält.
Folgende Ordner in unserer deployten Webseite sollen diese Rechte erhalten: "ProductImages", "PunchOutImages", "Style", "TempFiles", "CmsImages".
Nun hilft diese Funktion:
1: function SetFolderUserRights
2: {
3: $folderNames = "ProductImages", "PunchOutImages", "Style", "TempFiles", "CmsImages"
4:
5: $templateAcl = Get-Acl ($path_sourceRoot + "/user-rights.template")
6:
7: foreach($folderName in $folderNames){
8: Set-Acl -Path ($path_targetDeployment + "/" + $folderName) -AclObject $templateAcl
9: }
10: }
Im nächsten Schritt gilt es, die IIS Web-Application mit Powershell einzurichten:

- Posted by robert on Mai 8, 2009
Beim Einrichten einer neuen Webseite geht es immer auch darum ein paar Konfigurationswerte anzupassen. In unserem konkreten Fall benötigen wir lediglich:
- ApplicationPath
- ConnectionString
Hier hilft der klassische Template Processor:
Wobei “Deployment.ps1” die “Template-Engine” ist
1: function CopyAndChangeWebConfig
2: {
3: $webConfigTemplate = Get-Content -Path $path_sourceConfigTemplate -Encoding UTF8;
4: $webConfigTemplate = $webConfigTemplate -replace("#ApplicationPath#", $path_targetDeployment );
5: $webConfigTemplate = $webConfigTemplate -replace("#ConnectionString#", $Server );
6: Set-Content -Path ($path_targetDeployment + "/web.config") -Encoding UTF8 -Value $webConfigTemplate;
7: }
Lesen, ersetzen, zurückschreiben und leicht zu erweitern.
:-)
- Posted by robert on Mai 8, 2009
Das Script wächst:
Hier die Funktion “CopyTemplateToTarget”:
1: ##################################################
2: # FILE SYSTEM: DATA SECTION
3: ###################################################
4: function CopyTemplateToTarget
5: {
6: if ((Test-Path $path_targetDeployment) -eq $false ){
7: New-Item $path_targetDeployment -Force -ItemType directory;
8: }
9:
10: copy-item $path_sourceDeploymenPackage* $path_targetDeployment -recurse -force
11:
12: PrintElapsedTime
13: }
Die Variable $path_targetDeployment beinhaltet den Ordner, in den kopiert werden soll. Existiert dieser Ordner nicht, so wird er erstellt.