Die XML-Modellbindung schlägt nach einiger Zeit in ASP.net WebApi2 fehl

9

Ich habe mehrere Webapi-Micro-Services in TopShelf-Containern gehostet, die JSON- und XML-Formatierer akzeptieren und darauf antworten. Nach einer gewissen Laufzeit stoppt der XML-Formatierer die Bindung der XML-Anforderungsdaten an das Modell. Die Übergabe von JSON oder Form-Data funktioniert weiterhin . Angeben eines Accept: application/xml -Headers, der zu einer XML-Antwort führt. Das erneute Abspielen der fehlgeschlagenen XML-Anforderungen nach dem Neustart des Dienstes gibt die erwarteten Antworten zurück .

Die Ursache des Problems liegt darin, dass die Eigenschaft SupportedMediaTypes des XmlFormatter zu einem bestimmten Zeitpunkt gelöscht wird, während der Dienst ausgeführt wird und die Modellbindung fehlschlägt.

Wie finde ich heraus, was die SupportedMediaTypes löscht?

Notizen während der Untersuchung des Problems folgen.

Ich kann das Problem in keiner Umgebung replizieren, mit der ich einen Debugger verbinden kann.

Einer der Dienste hat bei der lokalen Fehlersuche fehlgeschlagen. Von dem, was ich sehen kann, wählt es den DataContractSerializer statt den XmlSerializer für die Deserialisierung.

Die Startup-Klasse fügt die Formatierer in dieser Reihenfolge hinzu:

%Vor%

Das Überprüfen der Formatierreihenfolge in HttpConfiguration zeigt, dass der XmlSerializer-Formatierer Priorität hat:

%Vor%

Der% formator UseXmlSerializer == true gibt an, dass er den Typ lesen kann, aber der% formator format co_de% wird von der Sammlung selbst mit UseXmlSerializer == false :

ausgewählt %Vor%

Warum gibt die Methode System.Object den Formatierer mit niedrigerer Priorität zurück?

Überprüfen Sie die Quelle für MediaTypeFormatterCollection.FindReader auf GitHub (danke Microsoft!), dachte ich, um die MediaTypeFormatterCollection für beide Instanzen zu sehen:

%Vor%

Bei einem Neustart des Projekts ist die Sammlung für Formatierer [1] die gleiche wie für Formatierer [2].

Die einzigen Verweise auf die Eigenschaft SupportedMediaTypes im Projekt sind, wo MediaTypeFormatter.SupportedMediaTypes im Konstruktor ein eigenes RecordSetMediaTypeFormatter setzt.

Was löscht die Eigenschaft SupportedMediaTypes des XmlFormatter zur Laufzeit?

    
psaxton 07.10.2016, 15:12
quelle

0 Antworten