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.

image

Kommentar schreiben