Ich führe einen ServiceHost aus, um einen meiner Dienste zu testen, und alles funktioniert gut, bis ich eine FaultException geworfen habe - bang bekomme ich XML, nicht JSON
mein Servicevertrag - schön
%Vor%Host-Einrichtung - scrummy yum
%Vor%Hier ist der Anruf - oo Bauchschmerzen
%Vor%Der Text var enthält den richtigen Fehler, aber serialisiert als Xml Was habe ich hier falsch gemacht?
Die Antwort ist, einen IErrorHandler und unterstützendes Verhalten zu implementieren
Ich fand diesen ausgezeichneten Beitrag von iajjuschchell
Ich kann die Lösung gerne präsentieren. Ich hatte genau das gleiche Problem und nachdem ich ein wenig mit meiner Endpunktverhaltenskonfiguration verwirrt hatte, entdeckte ich das benötigte Konfigurationselement. Die Lösung besteht darin, zu erzwingen, dass wcf das ausgewählte Format (json) verwendet:
%Vor%Wie Sie sehen, war der Schlüssel das Attribut "automaticFormatSelectionEnabled".
Viel Spaß mit der WCF wieder
Dies wird Ihnen wahrscheinlich nicht den "Warum" -Teil geben. Schauen Sie sich einen diese Frage . Sie können die Fehler erfassen und neu formatieren, bevor sie als Antwort ausgegeben werden. Dies wird mindestens Ihre Antworten genug json-iize, um Sie in Gang zu bringen. dies hat auch eine ähnliche Idee dahinter .
Laut MSDN-Dokumentation für DataContractJsonSerializer :
"Wenn während der Serialisierung einer ausgehenden Antwort auf dem Server ein Fehler auftritt oder die Antwortoperation aus einem anderen Grund eine Ausnahme auslöst, wird sie möglicherweise nicht als Fehler an den Client zurückgegeben."
Auch das ist reine Spekulation, aber es sieht fast so aus, als würde dieser Serializer nach XML serialisieren und dann in JSON konvertieren. Wenn der Fehler auftritt, wird er mitten im Prozess unterbrochen. Dann könnte ich wieder völlig falsch liegen.
Viel Glück.
Ich verstehe nicht, warum Sie WebRequest zum Aufrufen eines WCF-Dienstes verwenden. Gibt es einen bestimmten Grund dafür? Woher weißt du, wenn du das WebException
handelst, dass es ein FaultException<CategoryNotFound>
ist?
Wenn Sie einen Dienstproxy verwenden und Ihr Dienst FaultException<T>
ausgibt, ist es wahrscheinlich besser, Ihre try-catch
wie folgt zu schreiben: