Archive for the '.NET' Category
June 13th, 2012 by Marco Scheel
Ich hatte heute auf unserem Bootcamp eine Anfrage von einem unserer Consultants bezüglich meines Projektes zum Wechseln von Benutzern auf dem IIS bekommen. Ich hatte das vor kurzem in einem Post gebloggt. Es ging um eine Konfiguration im Bereich Publishing TMG und genauer um Forms Authentication vs. Integrated Authentication. Wir haben kurz die Anwendung im Lab OWA erfolgreich getestet. Je nachdem wie der Kunde sich entscheidet gehen wir damit auch Live.
Bei der Konfiguration sind uns allerdings ein paar Dinge aufgefallen:
- Die Konfiguration im OWA Ordner war nicht erfolgreich. Alle Aufrufe für den Handler wurden ignoriert und es wurde OWA angezeigt.
- Die Lösung war einfach auf dem Web einen neuen Ordner im Root anzulegen und dort eine eigen Application für den Handler zu konfigurieren. Bei einem ersten Test ist allerdings aufgefallen, dass die Authentifizierung erst mal nicht wollte. Problem könnte hier Kerberos sein, da der normale App Pool ein anderen Account verwendet. WIr haben kurzerhand einfach den OWA App Pool verwendet und schon funktionierte die Lösung.
- Nach der erfolgreichen Ummeldung landet man aber per Default im Root des aktuellen Folders, was für die OWA User jetzt keine Option ist, da hier nichts liegt
Mein Kollege hat das ganze per HTML Meta Refresh gelöst und ich hab das dann gleich integriert, da ich so ohne Code Änderung auskommen.
Bis heute habe ich tatsächlich schon 26 Downloads und immerhin 286 page visits
Ciao Marco
June 11th, 2012 by Marco Scheel
Wir sind aktuell auf Bootcamp und ich habe Claims und alles drum herum zum Thema. Natürlich ist auch die Migration aus “alten” Systemen ein Punkt auf der Agenda. Ich brauche also ein altes System… Also habe ich schnell eine ASP.NET 4.5 WebForms Site angelegt und konnte auch schnell die Logins aus dem SQL Membership Provider zum Fliegen bekommen. Allerdings konnte ich keine Seiten vor Zugriff über eine spezielle Role schützen. Hier meine Web.Config:
<location path=“Admin.aspx“>
<system.web>
<authorization>
<allow roles=“Admins“/>
<deny users=“*“/>
</authorization>
</system.web>
</location>
Bei einem Test hattet die Konfiguration aber kein Erfolg. Mein Admin User durfte die Admin.aspx einfach nicht sehen. Eine kurze Recherche hat gezeigt, dass ich den Role Provider der zwar vorkonfiguriert war noch enablen mußte.
Vorher:
<roleManager defaultProvider=“DefaultRoleProvider“>
<providers>
<add name=“DefaultRoleProvider“ type=“System.Web.Providers.DefaultRoleProvider, System.Web.Providers, Version=1.0.0.0, ulture=neutral, PublicKeyToken=31bf3856ad364e35“ connectionStringName=“DefaultConnection“ applicationName=“/“ />
</providers>
</roleManager>
Nachher:
<roleManager defaultProvider=“DefaultRoleProvider“ enabled=“true“>
<providers>
<add name=“DefaultRoleProvider“ type=“System.Web.Providers.DefaultRoleProvider, System.Web.Providers, Version=1.0.0.0, ulture=neutral, PublicKeyToken=31bf3856ad364e35“ connectionStringName=“DefaultConnection“ applicationName=“/“ />
</providers>
</roleManager>
Anschließen konnte ich mit dem Admin User die entsprechende Seite aufrufen
Ciao Marco
May 27th, 2012 by Marco Scheel
Meine Kollege Karten Kleinschmidt und ich haben beim Kunden ein interessante kleine Aufgabe bekommen, in der es darum ging, den verwendeten Benutzer (Domainen Benutzer) an einer bestehenden Webseite zu wechseln.
In einem Unternehmensnetzwerk mit integrierter Anmeldung an der Domain muss der User im Normalfall keine weiteren Anmeldeinformationen eingeben, um auf Websites zuzugreifen. Anwendungen wie SharePoint, CRM und viele Eigenentwicklungen nutzen diese Funktion natürlich für Authentifizierung und Autorisierung aus. Es kommt aber immer mal wieder vor, dass der aktuelle Benutzer nicht der “richtige” Benutzer für die aktuelle Aufgabe ist. In vielen Unternehmen haben Benutzer neben dem eigenen Account einen administrativen Benutzer (gk\ms und gk\adm_ms). Ist man am PC mit dem normalen Account angemeldet und möchte nun den administrativen Account verwenden, dann muss man den ganzen Brower mit anderen Credentials starten, sich am PC ummelden oder per Terminal Services auf einem anderen Rechner anmelden. Anwendungen wie SharePoint bieten solche Funktionen Out-Of-The-Box bereits an. Für Anwendungen, welche das nicht können, ist es für den normalen Mitarbeiter im Unternehmen kein leichtes Unterfangen, diese Aufgabe zu lösen.

Karsten (und damit irgendwann auch ich) hat nun die Aufgabe, für eine Website im Lync Umfeld so eine Funktion anzubieten. Eine kurze Recherche (Bing | Google) hat gezeigt, dass Roel van Lisdonk in seinem Blogpost ASP .NET – C# – How to “Sign in as Different User” like in Microsoft SharePoint with Windows Authentication genau das beschreibt. Seine Lösung ist allerdings Page-basierend und ich wollte was allgemeineres. Ich habe dann einfach seine Code als Basis genommen, ein HTTPModule erstellt und das Ergebnis dann auf Codeplex veröffentlicht. Da nicht so viel Eigenleistung drin steckt, war es schnell klar, dass es nur “fair” ist es weiter zu teilen. Hier ist also das erste Glück & Kanja Codeplex Projekt.
http://signinas.codeplex.com – Glück & Kanja Consulting AG – Sign In As A Different User

Das Projekt steckt sicher noch in den Kinderschuhen und kann deutlich erweitert werden, aber dafür gibt es ja Codeplex
Ich hatte übrigens viel “Spaß” mit Codeplex, aber das ist ne andere Geschichte und die Schuld von TFS
September 29th, 2010 by Marco Scheel
Eigentlich nicht mein Dinge auf irgendwelche Blogposts hinzuweisen, aber denke hier ist mal eine Ausnahme angesagt. Es geht um eine Lücke in ASP.NET, die seit einigen Tagen die Runde macht. Hier das Security Bulitin von MS:
http://www.microsoft.com/technet/security/bulletin/ms10-sep.mspx
ScottGu beschreibt sehr schön, was zu tun ist und welche Auswirkungen es hat, wenn man das ASP.NET Security Update anwendet.
http://weblogs.asp.net/scottgu/archive/2010/09/28/asp-net-security-update-now-available.aspx
Betroffen ist auch SharePoint (2007/2010) und somit sollten alle Admins loslegen.

![image[9] image[9]](http://marcoscheel.de/files/2010/09/image9_thumb.png)
Unsere Sharepoint 2010 Installation hat leider eine Reboot benötigt. Auch wenn ScottGu sagt, dass es eigentlich keinen braucht… Schade.
Ciao Marco
June 13th, 2009 by Marco Scheel
Beim Arbeiten mit den ADO.NET Data Services (aka Astoria) kommt man irgendwann an den Punkt, dass die Aufgaben komplizierter werden oder die Last auf die Server steigt. In solchen Situationen ist man mit potentiellen Timeouts in allen Ebenen konfrontiert. In diesem Post zeige ich welche Timeouts es gibt, aber speziell will ich zeigen wie ich das Timeout des Entity Frameworks (SQL) in Kombination mit der MS REST Schicht ADO.NET Data Services anpassen kann.
Es bleibt anzumerken, dass in der aktuellen Version V1 ein Bug existiert. Die Serverkomponente wirft bei einem Timeout eine NullReferenceException anstatt die eigentliche Fehlermeldung, was leider nicht wirklich weiter hilft.
Welche Timeouts gibt es also und was sind die Defaults:
- HTTP Client Timeout – Browser
Leider habe ich hier kaum Informationen gefunden… nichts was ich hier schreiben möchte.
- HTTP Client Timeout – ADO.NET Data Services Client Library
Wo: Code
Default: 100.000 Millisekunden (100 Sekunden) vererbt von HttpWebRequest.Timeout
Mehr: MSDN – System.Data.Services.Client.DataServiceContext.Timeout
Mehr: Microsoft KB 962933: Client Timeout Bug
Mehr: ADO.NET Data Services Team Blog: Client Timeout Bug
- HTTP Server ExecutionTimeout
Wo: web.config
Default: 110 Sekunden (wenn Debug=False, dann unendlich)
Mehr: httpRuntime Element (ASP.NET Settings Schema)
- ADO.NET Data Services Server Library
Hier gibt es kein extra Timeout. Die unterliegende Connection (zum Beispiel SQL) bestimmt die Dauer.
- Entity Framework Connection/Command Timeout (SQL)
Wo: Code
Default: 30 Sekunden CommandTimeout
Default: 15 Sekunden SqlConnection
Wenn wir uns nun um ein Timeout kümmern müssen wir also immer checken, ob wir damit gegen ein anderes rennen. Angenommen wir wollen unseren Sql Queries 5 Minuten Zeit geben (nur für das Beispiel!), dann müssen wir folgendes tun:
- Entity Framework Timeout = 5*60 = 300 Sekunden
- HttpServer Timeout = 5*60 + 10 (Puffer) = 310 Sekunden
- ADO.NET Data Services Client Timeout = 5*60*1000 + 20*1000 (Puffer) = 320.000 Millisekunden (320 Sekunden)
Wichtig: Wir brauchen überall ein wenig Puffer, sonst kann es sein, dass uns die Gesamtgeschwindigkeit der Maschine (da kann ja noch mehr Code dazwischen laufen) dazwischenkommt.
Jetzt zum eigentlichen Inhalt des Posts
Wie kann ich überhaupt das Timeout des Entity Frameworks erhöhen. Die ADO.NET Data Service Website nutzt das Entity Framework und stellt so die Tabellen und Views zur Verfügung. Der Default Code in den SVC Dateien erlaubt es nicht die Connection zu beeinflussen:
using System;
using System.Web;
using System.Collections.Generic;
using System.ServiceModel.Web;
using System.Linq;
using System.Data.Services;
using NorthwindModel;
namespace SimpleDataService
{
public class Northwind : DataService<NorthwindEntities>
{
public static void InitializeService(IDataServiceConfiguration config)
{
config.SetEntitySetAccessRule("*", EntitySetRights.All);
}
}
}
Die Klasse DataService<T> bietet nun eine Methode CreateDataSource mit der ich von Hand die EntityConnection erzeugen kann und somit auch den Command Timeout setzen kann:
protected override NorthwindEntities CreateDataSource()
{
var dbcon = new NorthwindEntities();
dbcon.CommandTimeout = Core.Config.Application.TimeoutSql; //Core is my helper library
return dbcon;
}
Ich hoffe ich kann dem einen oder anderen weiter helfen
Mir weiter geholfen bei der Lösung hat folgender Blogpost:
Timeout in ADO.Net Entity Framework and ADO.Net Data Services
Ciao Marco
June 6th, 2009 by Marco Scheel
In einem meiner letzten Projekte bin ich in die “glückliche” Lage gekommen, mit einer VAX über FTP zu kommunizieren. Gegen unser IIS7 FTP hatten alle Tests super funktioniert. Ich verbinde mich gegen den Server und mache dann einen Upload mit der Angabe der vollen URI:
Connect: ftp.servername.com
Upload File: /upd/knr/abc/request.txt
Mein erster Code nutzte die native C# FTP Api und antwortet einfach nur mit einem Fehler ohne Details. Ich habe dann auf eine Komponente von Aspose zurückgegriffen (wir nutzen Aspose.NET Total, was ich nur empfehlen kann). Ich bekam folgende Fehlermeldung:
Aspose.Network.Ftp.FtpException: Failed to upload file :500 %CLI-W-IVQUAL, unrecognized qualifier – check validity, spelling, and placement
at Aspose.Network.Ftp.FtpClient.Upload(Stream localStream, String remoteFilePath)
at Aspose.Network.Ftp.FtpClient.Upload(String localFilePath, String remoteFilePath)
at Ibu.Core.Utility.Ftp.UploadFile(String localFilename, Boolean append) in C:UsersscheelCodeProjectXCoreUtilityFtp.cs:line 403
at ConsoleApplication1.Program.Main(String[] args)
Eine kurze Recherche brachte tatsächlich ein Ergebnis:
http://www.physiology.wisc.edu/comp/docs/mg/ftp_users_guide.html
If the remote file specification includes “/”, it will be necessary to enclose the entire remote file specification in double quotes, because the FTP command interpreter interprets “/” as the beginning of a qualifier. Notice the difference in behavior on some systems if the remote file specification is and is not quoted.
Meine Lösung: Ich habe den führenden Slash einfach weg gelassen und schon hat es funktioniert.
Ciao Marco
May 12th, 2009 by Marco Scheel
Dirk Primbs stellt die Frage nach den Top Development Tools.
Dirk Primbs: 10 Tools, die jeder .NET Entwickler kennen sollte
Ich stimme zu und hier meine Erweiterungen:
- LinqPad: Dirk nennt den Snipped Compiler… ich selber stehe auf LinqPad, der mehr als nur Linq kann. Für 19$ gibt es dann auch Autocompletion.
- Live Mesh: Ich habe eine Hauptentwicklermaschine und zusätzlich noch eine Windows Server 2008 VM. Meine Tools (um die es hier und in Dirks Post geht) und meine Reference Libraries (SharePoint DLL’s, Log4Net, …) halte ich so auf allen Rechnern aktuell und das ohne großen Aufwand.
- XML Notepad 2007: Da heute “Alles” als XML daher kommt, bringt das Tool einen schnellen Einstieg auch in komplexere Strukturen.
- TortoiseSVN: Wir nutzen SubVersion und damit ist das Tool absolute Pflicht.
Wie sieht es bei euch aus?
Ciao Marco
April 20th, 2009 by Marco Scheel
Ich hatte die Gelegenheit, meinem Kollegen Jan bei einem Projekt zu helfen. Es geht darum, aus einer C# Applikation PowerShell Scripte zu erzeugen. Diese Scripte werden dann später auf einem Server ausgeführt. Klingt erst mal nicht wirklich spannend. Spannend wurde es dann, als der Code für die Erzeugung abgeschlossen wurde und das erste mal die Scripte ausgeführt wurden. Die PowerShell meldete eine kryptische Exception:
Unexpected token in expression or statement.
Beim Editieren des PowerShells mit dem neuen Windows 7 PowerShell Editor kommt beim Speichern folgende Meldung:
Und schon hatten wir den fehlenden Hinweis. .NET Applikationen arbeiten per Default mit UTF-8. Die PowerShell kommt aber wohl mit einigen Zeichen nur klar, wenn die Datei mit dem Unicode Encoding geschrieben wurde. Der Code wurde also kurz erweitert:
1: //Alt
2: //File.WriteAllText(saveTo, fileContent);
3: //Neu
4: File.WriteAllText(saveTo, fileContent, System.Text.Encoding.Unicode);
Es kann manchmal so einfach sein
Ein kurzer Test per NotePad2 zeigt das Ergebnis:
Vorher:
Nachher:
Sollte irgendjemand den genauen Grund kennen, dann wäre ich für einen echten Grund, warum die PowerShell hier streikt dankbar. Kurze Recherchen haben leider nichts gefunden :-S
Ciao Marco
March 9th, 2009 by Marco Scheel
Heute habe auch ich Post im Briefkasten. Das .NET Logo (seit der PDC 08) stand gleich neben meinem Name. Der Inhalt war etwas rätselhaft:
Natürlich hab ich gleich die Microsoft Tag Software für mein Windows Mobile installiert (was bestimmt Ziel der Aktion war):
GetTag.mobi
Microsoft – Tag
Mein Kollege Jan hat es auch schon erwischt:
Jan Geisbauer – Stille Post
Und weitere .NET Devs:
Es gibt aber auch negatives Reaktionen:
Kay Giza – Bin sauer: Virales Marketing, es nervt!
Mich persönlich stört es nicht… aber ich bekomme so etwas nicht so oft
Bin mal gespannt, ob da noch was raus kommt.
Ciao Marco
UPDATE 2009-03-10: Nach dem Hinweis von Kay (danke für den Kommentar) habe ich den Titel geändert (alt: Post von Microsoft mit Tag und 01).
March 3rd, 2009 by Marco Scheel
Seit letztem Jahr arbeiten wir an einem Projekt, welches die ADO.NET Data Services (aka Astoria) einsetzt, um auf die Daten einer Microsoft SQL 2008 Datenbank zuzugreifen. Der Einsatz der Technologie hat gezeigt, das die Theorie zu REST + SQL Server DB ganz toll klingt, man sich die Features aber teils teuer erkauft. Ich möchte irgendwann man ein eigene Post zum Thema schreiben. Heute möchte ich einfach mal zeigen, über was man sich plötzlich alles freuen kann (aus dem Blog von des Astoria Teams):
Row Count:
One scenario we heard a ton of feedback on after shipping V1 of ADO.NET Data Services in the .NET Framework 3.5SP1 is the ability for the a client of a data service to determine the total number of entities in a set without having to retrieve them all. To address this need, we have extended the data services addressing scheme to allow a client to obtain this type of information without having to download all the entities in a set.
Enhanced BLOB Support:
This feature enhances the BLOB support provided in V1 to enable data services to stream arbitrarily large BLOBs, store binary content separate from its metadata, easily defer the loading of BLOB content when its metadata is requested, etc. For CTP1 we’ll include server side support for this feature only. Client library support will likely come in a future CTP.
Mehr Informationen findet man hier:
Project Astoria Team Blog – Announcing ADO.NET Data Services v1.5 CTP1
JohnPapa.net – ADO.NET Data Services v1.5 is on its way
Die Entscheidung in unserem Projekt zu Gunsten von ADO.NET Data Services bleibt noch immer eine richtige, allerdings hätte man als "Dev mit Microsofterfahrung” wissen müssen, das eine V1 nie reibungslos läuft
Ciao Marco
P.S. Was mich am meisten stört, ist die Problematik richtig nach dem Produkt zu suchen, da es bisher wohl keine “offizielle” Abkürzung gibt.