Jscript Zauberei mit Silverlight

Wenn man nachfolgende Webentwicklern um den Verstand bringen will, arbeitet man mit dynamisch generierten JScript Code. Da gibt es nachher nichts im Browser zu sehen mit View Source. Um das ganze auf die Spitze zu treiben, erzeuge ich aus  einer Silverlight Anwendung den Code im Browser. Es gibt dazu auch durchaus Probleme, die zu dieser Lösung passen könnten. In früheren Silverlight Weblog Eintrag habe ich beschrieben wie man statt WebClient den Browser Stack direkt ansprechen kann. Basierend auf diesem Ansatz nun eine Jscript Lösung. Ist kein schöner Code, sondern eher nur konzeptionell. Basis ist eine XMLRPC Abfrage der Gültigkeit einer USTID beim Finanzamt. Zunächst wird eine Callback Funktion mit Rufmichan im Browser erzeugt. Dann wird die Methode erzeugt die dann eine Instanz des XMLHTTP Objektes erzeugt und den Webservice aufruft. Dann muss diese Funktion (callws) aufgerufen werden. Dies passiert per Invoke. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button1.Click createRufmichan() createJSCall("http://evatr.bff-online.de/evatrRPC?UstId_1=DE123456789&UstId_2=AB1234567890&Firmenname= &Ort=&PLZ=&Strasse=&Druck=") Dim r = HtmlPage.Window.Invoke("callWS") End Sub Nun sehen wir uns den Code an der im Browser erzeugt werden soll und wie das geschieht. Um der nachfolgenden Rückruffunktion eine Möglichkeit zu geben auf dei INstnaz zuzugreifen wird w ausserhalb der Funktion callWS definiert. Das HtmlPage Objekt von Silverlight kann per Createlement auch JScript Elemente erzeugen und dann per AppendChild ans DOM des Browserwindows anhängen. Public Sub createJSCall(ByVal url As String) Dim s As String = "w = new XMLHttpRequest();w.onreadystatechange=rufmichan;w.open('GET', url; w.send(null);" Dim js = HtmlPage.Document.CreateElement("script") js.SetAttribute("type", "text/javascript") js.SetAttribute("text", "var w;function callWS() {" + s + " }") HtmlPage.Document.DocumentElement.AppendChild(js) End Sub Wenn dann der Callback zurück kommt wird folgende Funktion benötigt. Public Sub createRufmichan() dim js = HtmlPage.Document.CreateElement("script") js.SetAttribute("type", "text/javascript") js.SetAttribute("text", "function rufmichan() {if (w.readyState == 4) {alert(w.responseText);}}") HtmlPage.Document.DocumentElement.AppendChild(js) Das wars schon. Wie kann ich aber feststellen das alles passt? Natürlich wenn die Messagebox mit dem Ergebnis kommt. Auch sehr hilfreich sind seit IE8 die Entwiclertools zu starten mit F12 Taste.

IIS-Pickup-Verzeichnis kann nicht abgerufen werden bei SMTPClient.Send

Oder wie der Brite auch sagen würde “Cannot get IIS pickup directory”. Beim senden von EMails aus ASP.NET per SMTP Service kann ich immer nur raten, nicht die Network Methode zu wählen, sondern direkt ins Pickup Directory des IIS zu schreiben. Das geht schneller und ist ausfallsicher falls der SMTP Server mal nicht erreichbar ist. Ein typischer Anwendungsfall von asynchroner Architektur. Nun ist der SMTP Server beim IIS 7 (und 7.5) noch immer der alte aus dem IIS 6. Wenn man also WIndows Server 2008 oder 2008 R2 hat muss man den SMTP Server extra verwalten mit der alten MMC Console. Das heist die Metabase ist nach wie vor im Spiel und nicht die neuen Config Dateien. Übrigens war Microsoft auf so nett den POP3 Server rauszunehmen. Worauf mein Kollege Cosmin den kostenfreien VIsendo SMTP Extender programmiert hat. Beim IIS7 7.5 wird per default der Benutzer ApplicationPoolIdentity verwendet um die Web Anwendung zu betreiben. Dieser Benutzer hat stark limiterte Rechte. Ebenso fehlt wohl das Zugriffsrecht (ACL) auf die Einträge aus dem SMTP Bereich in der Metabase. Wenn nun beim versenden einer Mail die Meldung kommt “IIS-Pickup-Verzeichnis kann nicht abgerufen werden” dann helfen folgende Lösungsansätze 1) In der Web.config den Namen des  Pickupdirectorys manuell setzen http://blog.ppedv.de/hannesp/archive/Mail-Sender-Klartextnamen-in-web.config-setzen 2) Man kann dem Beutzer auch die Rechte geben. Dazu sollte man den Metabase Editor verwenden. Dieser ist im IIS6 Resource Kit enthalten. Per Rechtsclick auf den Knoten im Tree (hier 1) kann man dann die benötigten Rechte setzen. 3) Den Benutzer in den Einstellungen des Application Pools ( Abbildung 1) auf System ändern. Mit entsprechenden Konsequenzen in der Sicherheit.

HTTPS fr IIS und das gratis

Eine Kurzanleitung wie man ein SSL Zertifikat für einen Webserver for Free (gratis, Umsonst, megabillig) bekommt. Der Anbieter startssl bietet diesen Service. Man muss sich anmelden und bekommt dann einen Code per Mail. Mit diesem wird ein Client Zertifiakt erstellt mit dem man sich am Service anmeldet. Im nächsten Schritt kann man dann eine Domain validieren. Idealerweise die Domain seines Webservers. Startssl schickt dann eine Mail an den Postmaster@domain.de wiederum mit einem Code. Diesen trägt man dann bei startssl auf der Website ein und die Domain ist gültig. Im nächsten Schritt wird ein Zertifikat erstellt für den Webserver   Hier erhält man eine Private Key als Text. Diesen wie angegeben speichern. Dann das Zertifikat (cer) auch als Text und wieder speichern. Der IIS kann dieses Zertifikat nicht direkt importieren sondern benötigt ein PCKS7 Format. Das kann mit Per Toolbox der Startssl Website erstellt werden. Die so erzeugte Datei auf den Webserver kopieren und dann im IIS7 im Stammknoten, Reiter IIS  Serverzertifikate Importieren. In der Website wird dann im Binding das passende Zertifikat in der DropDown Liste ausgewählt.

VSone 2010 meine Sessions und Workshop

Obwohl Visual Studio 2010 ein wenig später kommt, ist im Februar in München auf der VSone der richtige Zeitpunkt sich zu dem Thema ausführlich auszutauschen. Für mich als Web Guy, gibt es im ASP.NET Bereich, endlich mal wieder was richtig Neues. Ich werde nicht über ASP.NET MVC sprechen das macht jemand wesentlich kompetenterer, Scott Hanselman von Microsoft. ASP.NET Performance Boost In dieser Session werde ich über optimierungen vom Datenbank Server, über die Web Anwendung bis hin zum HMTL Code aus dem Nähkästchen plaudern. Ich behaupte mal frei erfunden das 90 % aller ASP.NET Anwendungen mit minimalen Aufwand mindestens doppelt so schnell sein könnten. Das bedeutet, das ein Web Server 100% mehr Request pro Sekunde bearbeiten kann. Das ist ja schon mal was. In vielen meiner Projekte ergaben sich sogar Ersparniswerte von über 90%. Silverlight 4 Silverlight ist meiner Ansicht nach die wichtigste Technologie von Microsoft, nach ASP.NET. Trotzdem haben noch nicht viele .NET Developer damit wirklich gearbeitet. Mein Ziel für diese Session ist, einen Überblick zu bieten. Also auch für Entwickler die kaum Ahnung von Silverlight haben. Ein Rundflug rund um die Technologie basierend auf der Version 4. Wer also schon seit Jahren mit SL 3 entwickelt wird deshalb auch viel Bekanntes hören. Umstieg von ASP.NET 2 auf ASP.NET 4 Ich mache auch jedes Jahr einen Workshop auf der VSone. Dieses Jahr möchte ich ASP.NET Experten ansprechen, die in der Regel am Stand von ASP.NET 2 entwicklen. Zwar hat sich mit ASP.NET 3.5 bzw SP1 ein wenig getan in Richtung Datenmodellierung und LINQ. Massiv findet man diese Funktionen  nicht Projekten und es ist auch nicht immer die beste Wahl. Dazu kommt nun mit ASP.NET 4 eine Reihe neuer Features und Verbesserungen im Detail. So werde ich sicher auf neue Controls bzw Änderungen in den Controls eingehen. Als Beispiel das Menu Steuerelement das nun endlich LI Tags rendern kann. Es exisitieren einige neuen EInstellungen auch in der Web.config. Dabei kann z.B. über Cache Provider an der Performance gedreht werden. Ziemlich viel hat sich im Client Teil getan, auch als AJAX bekannt. Templatres, browser seitige Datenbindung, Anbindung an JSON WCF Services oder ADO.NET Dataservice sind nun möglich und werden im Workshop vermittelt. Also dieser Workshop ist für alle ASP.NET Entwickler geeignet die kurz und bündig das wichtigste bis zur Version 4.0 lernen wollen.

Silverlight Anwendung wird in Firefox nicht angezeigt

Auf der VSone Website habe ich eine kleine Anwendung eingebaut die die Sprecher anzeigt. Leider war im Firefox davon nichts zu sehen. Im Internet Explorer klappts. Nach einem Tipp von meinem Kollegen Felix auf die Höhe des DIV zu achtren fand ich das Problem im Object Tag. Hier muss Height gesetzt sein sonst sieht man im Mozilla Firefox nichts von der Silverlight Anwendung. <div id="silverlightControlHost"> <object data="http://blog.ppedv.de/file.axd?file=:application/x-silverlight-2," type="application/x-silverlight-2" width="150"> <param name="source" value="ClientBin/SilverlightApplication1.xap"/> <param name="onError" value="onSilverlightError" /> <param name="background" value="Transparent" /> <param name="windowless" value="true" /> Ich bin mir nicht ganz sicher, ob es mit damit zu tun hat das ich das DIV per windowless über den HTML lege.

1 Tag Entity Framework lernen -zum gnstig Preis

Mehr Wissen in kürzerer Zeit, ist das Motto der ppedv Quickys. Diese neue Seminarreihe greift ganz konkrete Problemstellungen aus der Projektpraxis auf. Dieses mal geht es ums Entity Framework. Gerade die mittlere Schicht für den Datenzugriff wirft unglaublich viele Fragen auf. Was ist der beste Weg? Nehme ich nhibernate oder doch was von Microsoft? Wie löse ganz konkrete Aufgabenstellungen?  Genau das erwartet Sie an jedem der ppedv Standorte an einem Tag und zum unschlagbaren Preis. Natürlich Hands on um es selbst auszuprobieren. Die Teilnehmerzahl ist auf 10 pro Ort begrenzt. 30. Nov. in Köln 01. Dez. in Siegen 02. Dez. in Frankfurt 03. Dez. in Karlsruhe 04. Dez. in Stuttgart 07. Dez. in Dresden 08. Dez. in Leipzig 09. Dez. in München 10. Dez. in Burghausen 11. Dez. in Wien Also gleich anmelden und von den ppedv Experten lernen. Schliesslich ist die Architektur Entscheidung einer der wichtigstem im Softwareprojekt.

.NET RIA Services in ASP.NET verwenden

Im Zuge der Vorbereitungen zur ADC09 habe ich eine Demo geschrieben die mit den .NET RIA Services arbeitet. Leider ist das Zeugs noch nicht mal Beta und so wird sich vermutlich noch eine Menge ändern. .NET RIA Services sind die gefühlte 100ste Methode um Daten in entkoppelten System vom Server zur Anwendung zu bringen (WCF, ADO.NET Dataservcies, ASMX, REST, Socket ectect). Silverlight braucht das, da kein direkter Zugriff auf SQL Server möglich ist (noch nicht). Wenn man das ganze zu Ende denkt ist das nichts anderes als ein Service Layer. Und ein guter Service Layer kann auch von anderen UI Technologien konsumiert werden. In diesem Fall ASP.NET. Zunächst muss .NET RIA Service July installiert sein. Ausserdem brauchen wir eine Silverlight Business Application. Die nächsten Schritte nur im Eilverfahren, weil nicht Gegenstand des Blogs. Datenmodell mit z.B. Entity Framework das Orte anzeigt, Domain Service Class (DomainService1) mit der Methode getOrte. Dann im Web Verzeichnis ASP.NET anlegen. Sicherstellen das die beiden DLL’S Microsoft.Web.Extensions.dll und System.Web.DomainServices.WebControls.dll in der Version 99.0.0.0 im Bin Verzeichnis liegen. Eine Referenz im Projekt darauf erstellen. Dann erhält man ein neues ASP.NET Server Control DomainDatsource. In meinem Beispiel auf der ADC erzeuge ich damit eine Excel File mit Hilfe eines Repeater Controls. <%@ Page Language="vb" AutoEventWireup="false" CodeBehind="WebForm1.aspx.vb" Inherits="BusinessApplication1.Web.WebForm1" %> <%@ Register TagPrefix="asp" Namespace="System.Web.DomainServices.WebControls" Assembly="System.Web.DomainServices.WebControls" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> </head> <body> <% Response.ContentType = "application/vnd.ms-excel"%> <form id="form1" runat="server"> <asp:DomainDataSource runat="server" ID="ds1" DomainServiceTypeName="BusinessApplication1.Web.DomainService1" SelectMethod="GetOrte" /> <table> <asp:Repeater ID="Repeater1" runat="server" DataSourceID="ds1"> <ItemTemplate> <tr> <td> <%#Eval("plz")%> </td><td> <%#Eval("Ort")%> </td> </tr> </ItemTemplate> </asp:Repeater> </table> </form> </body> </html>

Mail Sender Klartextnamen in web.config setzen

Klein aber feines Problem. Wie setzt man den reelen Sendernamen in einer Email, so das er auch für den Empfänger lesbar ist? Die Lösung liegt im SMTP Protokoll im mail from command. Die muss in folgender Form übergeben werden. Voller name <mailadresse@domain.de> Wie macht man das aber in der Web.config um den Absender von extern zu setzen? Das kann manchmal sehr hilfreich sein, wenn man dies konfigurierbar halten möchte. Das größer bzw kleiner Zeichen muss XML üblich maskiert werden, sonst gibts Probleme mit dem Parser. <system.net> <mailSettings> <smtp from="hannesp&lt;hannesp@ppedv.dee&gt;" deliveryMethod="SpecifiedPickupDirectory"> <specifiedPickupDirectory pickupDirectoryLocation="c:\temp"/> </smtp> </mailSettings> </system.net>

IIS 7 LocalSqlServer nicht gefunden

Wir haben hier einen Windows 2008 Webserver mit IIS7, auf dem laufen jede Mengen Anwendungen erfolgreich und seit langer Zeit. Nun habe ich eine neues Silverlight 3 Programm für das ich eine virtuelle Anwendung erzeugt habe. Da gehört auch ein WCF Service dazu. Serverfehler in der Anwendung /svcs1. Konfigurationsfehler Beschreibung: Fehler beim Verarbeiten einer Konfigurationsdatei, die für diese Anforderung erforderlich ist. Überprüfen Sie die unten angegebenen Fehlerinformationen, und ändern Sie die Konfigurationsdatei entsprechend. Parserfehlermeldung: Der Verbindungsname LocalSqlServer wurde in der Anwendungskonfiguration nicht gefunden, oder die Verbindungszeichenfolge war leer. Quellfehler:   Zeile 164:connectionStringName="LocalSqlServer" Zeile 165:applicationName="/" Zeile 166:type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/> Zeile 167: Zeile 168:            </providers> Quelldatei: C:\Windows\Microsoft.NET\Framework64\v2.0.50727\Config\machine.config    Zeile: 166 Versionsinformationen: Microsoft .NET Framework-Version:2.0.50727.4016; ASP.NET-Version:2.0.50727.4016   Ziemlich uncool die Fehlermeldung. Vor allem, was soll das mit dem LocalSqlServer String? Das ganze ist ja in der machine.config angelegt und die ist seit Installation des Systems unverändert. Der Connection String wird ja auch nur benötigt wenn man die Standard Membership Funktion mit dem SQLExpress Server verwendet. Das tue ich aber nicht. Strukturierte Fehlersuche zunächst einmal wildes rumraten in der machine.config. Dann Einsicht: “die anderen Anwendungen laufen ja- es muss an der Anwendung liegen”. Dann leere Anwendung im IIS erstellen und test.aspx erzeugt. Auch Fehler. Was ist nun noch ein Unterschied? Web.config. Also Web.Config von funktionierender Anwendung kopiert und : geht! Nun in Web Config der Silverlight Anwendung einfach den Rolemanager entfernt. Das geht in IIS mit der modularen Architektur ganz wunderbar. <roleManager enabled="false"> <providers> <remove name="AspNetSqlRoleProvider"/> </providers> </roleManager> Überraschung: meine Silverlight Anwendung läuft. Es muss wohl ein Kompatibilitäts Problem sein mit dem Roleprovider aus  IIS7 und net 3.5 SP1. Wieder mal ein Beispiel für absolut bescheuerte Fehlermeldungen.

Windows 7, IE8 und Fiddler problem

Wer httpfiddler noch nicht verwendet ( ein HTTP Debugging Proxy) soll entwender sich das das Ding besorgen oder nicht weiterlesen. Für alle anderen war immer das tracen des lokalen HTTP Traffic ein Problem. Dies trifft ASP.NET und Silverlight Entwickler die über lokalen WebDevelopment Server ( vormals cassini) arbeiten. Bis IE6 war ein Aufruf auf http://localhost ohne Probleme möglich. IE7 zeigt den Trace in diesem Fall nicht mehr an, da IE7 so clever ist für lokale Abfragen keinen Proxy zu verwenden. Not a Bug – Feature! Der Workaround ist den Aufruf einfach mit einem Punkt zu versehen, also http://localhost./…. Ein Punkt ist eben ein typisches Kennzeichen einer Internet Domäne oder IP Adresse. Windows 7 scheint noch schlauer zu sein. Mit obigen Workaround erhalte ich  mit dem RC1 Build folgende Meldung im Browser [Fiddler] Connection to localhost. failed. Exception Text: Es konnte keine Verbindung hergestellt werden, da der Zielcomputer die Verbindung verweigerte ::1:50842 Das Problem ist, das der Name Windows 7 wenig Suchmaschinen freundlich ist . Querys ala Windows 7 fiddler  problem führen nicht zum Ergebnis. In diesem Fall hat mir die Seite des Fiddler Erfinder Eric Lawrence geholfen. Folgendes funktioniert http://ipv4.fiddler:50842/WebSite3/Default.aspx IPV6 würde übrigends den Netzwerk Adapter auf entsprechenden Protokoll adressieren.