Von Marcel Binot am
20.06.2007
Aller Anfang ist schwer. Insbesondere bei der Verwendung von Webservices für das AJAX Toolkit. Nicht, weil die Doku schlecht ist, oder die Anwendung der Controls so schwierig (ganz im Gegenteil), sondern weil man einfach nicht sieht, was da passiert, wenn die SOAP-Calls abgesetzt werden. Schlimmer noch: Man kann sich ja nicht einmal sicher sein, dass sie abgesetzt werden.
Was tun, wenn man nichts sieht? Augen aufmachen!
In diesem Fall heißt das: den Fiddler installieren. Dieses Tool arbeitet als Proxy zwischen dem IE und dem Web und zeichnet den Datenverkehr auf. Somit werden auch die sonst "unsichbaren" SOAP-Aufrufe sichtbar.
Vorsicht: Der Fiddler zeichnet http://localhost/... nicht auf. Hier muss man sich mit der aktuellen IP oder dem Computernamen behelfen!
Mit Hilfe des Fiddlers lassen sich die kleinen Hürden nun schnell meistern. Unter DNN gibt es allerdings noch einen Kniff in Bezug auf den ServicePath. Normalerweise gibt man hier im Control die URL zum...
|
Von Marcel Binot am
25.03.2007
Bei der Verwendung der DotNetNuke ClientAPI stieß ich trotz ausführlicher Dokumentation von Jon Henning schnell auf offene Fragen. Insbesondere war mir anfangs unklar, in welcher Methode ich welche Registrierungen oder Initialisierungen vornehmen mussste. Im folgenden kläre ich einige davon auf...
|
Von Marcel Binot am
26.02.2007
Für ein Projekt stand ich plötzlich vor der Aufgabe ein Modul programmatisch unsichtbar schalten zu müssen und stellte fest: Die Visible-Eigenschaft des Modul hilft da kaum weiter, denn damit schaltet man ja nur den Inhalt des Containers ab. Aber es geht auf andere Weise...
|
Von Marcel Binot am
18.04.2004
error (0x800CCC0F) : 'The connection to the server was interrupted. If this problem continues, contact your server administrator or Internet service provider (ISP). The server responded: +OK'.
Dieser Fehler tritt des öfteren bei bestimmten Spam-Mails in Verbindung mit Norton Anti Virus auf. Beim Herunterladen der Mails vom Mailserver wird die Verbindung plötzlich unterbrochen, sobald eine dieser ominösen Spam-Mails gefunden wird. Besonders störend ist, dass die bis dato heruntergeladenen Mails auf dem Mailserver nicht gelöscht werden. Wenn man nicht zufällig manuell auf den Server zugreifen kann, hat man schlechte Karten. Bei Symantec ist das Problem zwar bekannt (siehe Support-Artikel), allerdings fand ich dort bisher nur den Tip, die Email-Prüfung auszuschalten ( Uff! Das muss...
|
Von Marcel Binot am
04.04.2004
Viele Schwierigkeiten von Einsteigern bei der Erstellung eigener (Custom-)Controls ergeben sich aus der Unkenntnis des genauen Lebenszyklus eines solchen. Meist rühren die Probleme daher, dass bei einem PostBack der Zustand des Controls (samt seiner ChildControls) nicht 1:1 wieder hergestellt wird. Die Folge davon ist, dass beispielsweise die Event-Handler nicht mehr richtig zu den Controls zugeordnet werden können. (Dabei können erstaunliche, scheinbar mysteriöse Nebeneffekte auftreten, die, wenn sie den leidgeplagten Programmierer nicht zur Verzweiflung treiben würden, wirklich lustig wären. Beispielsweise wird statt des erwarteten, registrierten Event-Handler eines Controls auch schonmal der eines vollkommen anderen aufgerufen.)
Zu diesem Thema kann ich übrigens das Buch "ASP.NET Server Controls and Components" von Nikhil Kothari und Vandana Datye (erschienen im Microsoft-Verlag) emfpehlen. Darin ist auf Seite 175 auch der Lebenszyklus eines CustomControl abgebildet. Leider fehlen mir in dieser Darstellung...
|
Von Marcel Binot am
10.02.2004
Endlich ist es geschafft! Meine Direktanbindung an den Paymaster der Firma GZS funktioniert endlich.
Ich kann Euch gar nicht sagen, wieviele Nerven mich das gekostet hat. (An dieser Stelle noch einmal vielen Dank an die freundliche Dame vom GZS-Support-Team, die meinen ständigen Anfragen mit einer Engelsgeduld entgegentrat.)
Die Klasse, in der ich alle Funktionen zur direkten Kommunikation mit dem Paymaster gekapselt habe, steht eigentlich schon eine ganze Weile. Patrick hatte mir für erste Tests einen kleinen Server geschrieben, mit dem man den Paymaster simulieren konnte. Wir haben damit zunächst "Trockenübungnen" gemacht, weil unser Testaccount noch nicht fertig war.
Als es dann zur Sache ging, traten schnell die ersten Probleme auf. Der Verbindungsaufbau klappte, aber der Paymaster meldete uns statt eines fröhlichen "HTTP/1.1 200 OK" dauernd ein frustrierendes "HTTP/1.1 100 Continue". Mistfink! Sobald wir...
|
Von Marcel Binot am
15.01.2004
Es gibt in der web.config die Möglichkeit, die Applikation auf ein Sprachgebiet einzustellen. Das ist besonders dann wichtig, wenn man Umlaute in Requests verwenden möchte - mit UTF-8 (Standard-Eintellung) kommt man sonst natürlich nicht weit.
Alles was dafür zu tun ist, ist den Knoten innerhalb der von zu definieren. Das könnte z.B. so aussehen:
globalization fileEncoding="iso-8859-1" requestEncoding="iso-8859-1" responseEncoding="iso-8859-1">
Damit erreicht man z.B., dass Umlaute in Parametern richtig zurückgegeben werden. Ein Aufruf von, sagen wir,string meinParameterWert= Context.Request.QueryString["meinParameter"];liefert daraufhin auch äs, ös, üs und Konsorten.
Kleiner Trick, große Wirkung...:) ...
|
Von Marcel Binot am
09.01.2004
WebServices auf Basis von XmlRpc zu implementieren ist easy und in vielen Fällen absolut ausreichend. Doch wie sieht's mit SOAP aus? In PHP? Eine Low-Level-Unterstützung (wie bei XmlRpc) gibt es für SOAP leider nicht. Auf soapware.org fand ich verschiedene Ansätze für PHP. PEAR bietet sicherlich eine gute Implementierung, aber man benötigt dann natürlich x andere PEAR-Klassen. Das erschien mir irgendwie zu wulstig.Schnell landetet ich bei nuSphere von Dietrich Ayala. (Ich erinnere mich dunkel, dass ich vor zwei Jahren mit einem ersten Ansatz dieses Autors herumgespielt und erste WebService-Erfolge erzielt hatte. Das hat meine Entscheidung sicherlich beeinflußt...)Nach wenigen Minuten hatte ich einen kleinen Test-Service eingerichtet; kurze Zeit später einen Test-Client - easy!
Jetzt wollte ich natürlich wissen, ob man auch mit einem fremden Client auf den Server zugreifen kann. Doch schon...
|
Von Marcel Binot am
09.01.2004
Tja, mit den kompexen Datentypen und nuSOAP hatte ich heute erhebliche Probleme. Selbst das Beispiel von D.Ayala bekam ich nicht zum Laufen. Es haperte daran, dass ich die über $server->wsdl->addComplexType() erzeugten Datentypen nicht mit ihrem Namespace ('tns:...') registrieren konnte. Mit dem Namespace 'xsd:..' ging es, aber dann wurden die Methoden im Studio (bzw. der Web-Referenz) nicht richtig erkannt.
Patrick überedete mich dann von nuSOAP abzusehen und die PEAR-Implementierung auszuprobieren. Nachdem die abhängigen Pakete identifiziert und installiert waren (PEAR, Mail_MIME, HTTP_Request, Net_Url, Net_Dime, und Net_Socket), hatte ich schnell einen einfachen Server laufen - allerdings noch ohne komplexe Datentypen.Für die Registrierung von Servermethoden steht keine Methode zur Verfügung, sondern man erzeugt einen Hash-Eintrag in der Eigenschaft __dispatch_map:$this->__dispatch_map['Echo'] =array('in' => array('message' => 'string'),'out' => array('outputString' => 'string'));
Auch die Registrierung von...
|
Von Marcel Binot am
30.12.2003
Da bei meiner Modifikation des Kits das Aktivieren von neu registrierten Benutzern erforderlich ist, benötigte ich noch die Information, wann sich jemand neu registriert hat. Im User-Admin kann man zwar auch nach Registrierungsdatum sortieren, aber wer will schon ständig checken, ob da jemand hinzugekommen ist? Ich nicht.
Prinzipiell wären ja mindestens zwei Ansätze möglich: Erstens ein Control, dass alle Neuanmeldungen des letzten Monats anzeigt, und zweitens eine Email-Benachrichtigung dafür. Da man bei ersterem ja auch wieder ständig nachschauen muss, entschied ich mich für letzteres.
Um die neue Funktionalität möglichst sicher einzubauen, fügte ich sie nicht in der Registrierungsseite, sondern in der UserUtility-Klasse ein. Welches Skript auch immer eine Registrierung durchführt, wird dazu wohl diese Hilfsklasse verwenden. Diesen (doch recht tief sitzenden) Eingriff wollte ich nicht so ganz zwingend verankern. Schön fände ich, wenn man diese Funktion optional hinzuschalten könnte. web.confg? Jau! :) ...
|