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...
Read More »
|
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...
Read More »
|
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...
Read More »
|
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...:)
...
Read More »
|
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...
Read More »
|
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...
Read More »
|
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! :)
...
Read More »
|
Von Marcel Binot am
23.12.2003
Huch, wie die Zeit vergeht....:)
Nachdem ich in der vergangenen Woche der Benutzertabelle die Felder Status, Adressinfos und ein Geburtsdatum beschert habe, fehlte mir jetzt im FrontEnd noch eine Möglichkeit, die Benutzer an Geburtstage zu erinnern.Ursprünglich schwebte mir vor, die Geburtstagsinformationen in die Events-Section aufzunehmen. Ich merkte beim näheren hinsehen, dass sich das wohl eher schwierig gestalten sollte. Wie bekomme ich die Geburtstage da hinein? Ein Union-Selekt schied aus, da die User-Tabelle eigenständig ist, die Events aber zur Kategorie Content-Pages gehören. Relativ unvereinbar. Hmm.Sollte ich Events automatisiert in aus den Geburtstagsinfos erzeugen? Zu umständlich, und außerdem redundante Daten. Pfui!Dann fielen mir die WebBoxes ein. Eine WebBox, die die aktuell anliegenden Geburtstage (innerhalb der nächsten 2 Monate) anzeigt, und bei der ich über die Administration jederzeit entscheiden kann, ob und wo Geburtstage angezeigt werden. Bei der nicht angemeldete Benutzer keine...
Read More »
|
Von Marcel Binot am
18.12.2003
Ich habe eben die Replikationsmethode des XmlRpc-Servers für den Geo-Datenabgleich mit einem PDA fertiggestellt.
Mit den techn. Details mag ich hier jetzt keinen langweilen, deswegen umreiße ich nur kurz die Arbeitsweise. Falls jemanden die genaue Umsetzung interessiert, bitte nachfragen. ;)
Der XmlRpc-Server nimmt alle im PDA bearbeiteten o. angelegten Datensätze entgegen, und prüft für jeden einzeln, ob dieser bereits existiert oder neu angelegt werden muss. Anlegen ist eher trivial. Weil im PDA nur eine Untermenge von Feldern eines Datensatzes (8 von knapp 100) verarbeitet wird, muss der Abgleich beim Aktualisieren Feldweise geschehen. Außerdem bekommen geänderte u. neu angelegte Datensätze den Status 'update', bzw. 'new'. Dadurch können sie im FrontEnd entsprechend dargestellt werden und lassen sich so auch leicht herausfiltern, um sie z.B. mit anderen Servern abzugleichen.Dem PDA wird anschließend der komplette Datenbestand im XML-Format zurückgeliefert - natürlich reduziert um die Felder,...
Read More »
|
Von Marcel Binot am
17.12.2003
Heute habe ich eine kleine Korrektur in Nicholas Christophers XmlRpcCS-Paket vorgenommen. Der XmlRpcServer war bislang nicht in der Lage, Methoden-Fehler an den Client durchzureichen. Gut, man kann sich damit behelfen NULL zurückzuliefern, wenn ein Fehler auftritt, oder eine Exception auslösen, aber das ist clientseitig natürlich wenig aussagekräftig. Das war mir zu dünn.
Aus Sicht des Servers erschien mir am vernünftigsten, im Fehlerfall eine XmlRpcException zu werfen. Diese verfügt ja schon über die Informationen faultCode und faultString, wie sie in der XmlRpc-Spec definiert sind. Beim Ausprobieren fiel mir jedoch auf, dass das Framework die XmlRpcException an irgendeiner Stelle in eine eigene XmlRpcException kapselt, so dass beim Client nur ein 'Application Error - target method threw an exception' herauskam. Wo war mein Fehlercode? Wo mein Fehlerstring?
Nach ein wenig Sucherei im Code gelang es mir, das Verhalten so umzustellen, dass eine Unterscheidung zwischen XmlRpcException und anderen...
Read More »
|