Dienstag, 21. August 2012

Windows Communication Foundation - Monster die Zweite

Es gibt Neuigkeiten von der Front mit WCF und dem Hosten eines Services mit WsHttpBindung und NetTcpBinding im IIS.

Nachdem es mir beim letzten Mal gelungen ist, meinen Service endlich im IIS zu hosten, hatte ich noch Probleme beim Aufruf. So konnte ich problemlos mit dem WsHttpBinding arbeiten, bekam aber beim NetTcpBinding einen Timeout mit folgender Beschreibung:
"The sequence has been terminated by the remote endpoint. Due to a user abort the reliable session cannot continue. The reliable session was faulted."
Diese und ähnliche Fehlermeldungen werden von WCF erzeugt, wenn irgendwas schief geht. Leider erachtet WCF es nicht für nötig, mich darüber zu informieren, was genau das Problem war. Ist IIS falsch konfiguriert? Ist WCF falsch konfiguriert? Stimmt meine web.config oder app.config nicht? Muss eine Betriebssystem-Einstellung angepasst werden? Kann es an der Firewall liegen? Auf alle diese Fragen gibt WCF mir keine Antwort, sondern nur kryptische und völlig uninformative Meldungen.

Also musste ich mal wieder selber alles herausfinden, was - natürlich - erheblich viel Zeit in Anspruch nimmt, aber das kennen wir bei WCF ja schon.

Also prüfte ich zuerst meine Konfiguration. In meiner Not habe ich sogar alle Ratschläge aus dem IIS Blog befolgt (die Anmerkungen zu Application Pools sind erhellend!), jedoch erfolglos.

Nach ratlosem Suchen bemerkte ich eher zufällig: Es gibt eine Methode des Services, die sich via NetTcpBinding erfolgreich aufrufen lässt. Das bedeutet also, dass IIS, Betriebssystem und WCF grundsätzlich richtig eingerichtet sind.

Also analysierte ich genauer die Methoden, die sich nicht aufrufen ließen. Dazu heftete ich meinen Debugger an den Worker Process des IIS an. So konnte ich feststellen, dass die Methoden fehlerfrei ausgeführt wurden, und zwar bis zur return-Anweisung.

Nun muss man wissen, dass die Methoden DataSet-Instanzen liefern. Hat WCF etwa ein Problem bei der Serialisierung und dem Versand von DataSets? Da viele Leute genau sowas schon gemacht haben, lautet die ermunternde Antwort: Nein. Stattdessen fand ich den Ratschlag auf StackOverflow, man solle die Quotas erhöhen.

Die Quotas legen u.a. die Maximalgröße von Arrays, Nachrichtenblöcken und Paketen fest. Wenn diese Größen überschritten werden, kommt es in WCF zu Exceptions. Und diese Fehler heißen dann nicht etwa "Quota XY exceeded", was einem ja einen Hinweis auf die Fehlerursache geben könnte, sondern... hm... z.B.  "This request operation sent to XY did not receive a reply within the configured timeout", was uns natürlich in die total falsche Richtung schickt.

Nachdem ich die Quotas also entsprechend erhöht habe, lassen sich beide Bindings betreiben.

Ich möchte einen Toast aussprechen auf Microsoft und die Kunst, Probleme beim Namen zu nennen.

Keine Kommentare:

Kommentar veröffentlichen