2016-07-13 5 views
2

Ich habe ein wirklich verwirrendes Problem in Bezug auf das Zuordnen von Daten zu einem Modell in meiner Web-API. Es ist ein bisschen komplex, also lassen Sie es mich wissen, wenn ich es nicht gut genug erklärt habe und ich werde mein Bestes geben, um es auszuarbeiten.Web-API-Aufruf von Accessor für alle Eigenschaften während der Deserialisierung von JSON

See Edit 2, das Problem

Anwendung geändert hat Ich habe eine MVC 5, bei dem der Benutzer Formulardaten und die Daten einreicht wird einem Modell abgebildet automatisch basierend auf der die Namen der Felder auf passende JSON mit den Namen der Modellmitglieder. wenn die eingehende JSON für Benutzername ist beispielsweise in der Form:

{Id=0, Name=testName} 

Dann wird es ein Modell (zB Name nur) UsernameModel genannt werden, die ein int id und string name unter anderen Eigenschaften hat, die nicht braucht aus JSON gemappt werden (es gibt eine Anzahl dieser Modelle für eine Anzahl verschiedener Formen).

Ich bin nicht sicher, wie nützlich es sein wird, aber ich bemerkte, dass der Anruf an der Unterseite des Stapels Spur

System.Web.Http.Validation.DefaultBodyModelValidator.ValidateNodeAndChildren(
ModelMetadata metadata, ValidationContext validationContext, Object container, 
IEnumerable`1 validators) 

diese Validation etwas mit meinem Problem zu tun haben könnte, war?

Keiner von uns hat eine Idee, warum dies passiert und nur auf meiner Maschine passiert. Irgendwelche Ideen/Vorschläge? Dinge zu versuchen? Möglichkeiten, den Fehler einzugrenzen?

Edit:another question gefunden, die in Zusammenhang stehen können, aber es ist wirklich seltsam, dass dies nur auf meinem Computer auftritt, während in diesem Beitrag es nur ein generelles Problem war.

Bearbeiten 2: Ich habe das Problem eingegrenzt, und habe jetzt ein viel spezifischeres Problem. Ich habe entdeckt, dass auf meinem Computer die Web-API-Zuordnung des JSON zu dem C# -Objekt (oder einem anderen Prozess, der während des Mappings aufgerufen wird) die get() für jede Eigenschaft im Prozess des Mappings des Objekts aufruft. Aus diesem Grund wird die Ausnahme ausgelöst. Eine der Eigenschaften löst eine Ausnahme aus, wenn der get() (von Entwurf) aufgerufen wird. Auf anderen Computern wird die get() nur für die Eigenschaften aufgerufen, die von JSON zugeordnet werden, und wir sind nicht sicher warum.

bearbeiten 3 (revised): In System.Web.Http.Validation Erforschung fand ich this post die Frage, wie sie zu deaktivieren. Ich folgte den Anweisungen in der akzeptierten Antwort und deaktivierte die Standardvalidierung, und mein Problem ging weg! Ich bin immer noch mit der Frage, warum das zwischen zwei Computern anders sein würde, aber zumindest komme ich irgendwo hin!

+0

Es sieht eher für mich aus, dass der Fehler nicht das Mapping ist, es ist die Validierung. Die Validierung "weiß" nicht, welche Eigenschaften aus JSON gemappt wurden oder nicht. Es weiß nur, dass es ein Objekt hat und validiert seine Eigenschaften. Können Sie versuchen, die Überprüfung aus der Eigenschaft zu entfernen, die eine NotImplementedException auslöst? Ich schätze, wenn Sie es nicht bestätigen, wird es nicht angerufen. Das erklärt nicht den Unterschied zwischen zwei Computern, aber es könnte Sie dazu bringen, an einem anderen Ort zu suchen. –

Antwort

0

Ich konnte mein Problem lösen, indem ich die Standard-System.Web.HTTP.Validation-Validierung für mein gesamtes Projekt deaktivierte. Siehe this stack post für wo ich die Lösung erhielt, die unten gezeigt wird:

config.Services.Clear(typeof(ModelValidatorProvider)); 

Wenn diese an der Spitze der RouteConfig Datei gesetzt wird, wird die Standard-Validierung deaktiviert werden, und das Problem tritt nicht auf. Dies erklärt immer noch nicht, warum nur diese Eigenschaft auf meinem Computer validiert wurde, und diese Frage bleibt unbeantwortet, aber für den Zweck dieser Frage löst dies das Problem.

1

Für den gleichen Anwendungscode, auf zwei Computern so unterschiedlich zu verhalten, ist unwahrscheinlich. Es ist nicht unmöglich, nur unwahrscheinlich.

Wenn etwas passiert, das an unmöglich ist, hinterfragen Sie jedes Detail. Stellen Sie in diesem Fall die Frage, ob Sie an beiden Stellen den gleichen Code ausführen. Stellen Sie sicher, dass einer von Ihnen keine veraltete Version des Codes aus der Quellcodeverwaltung hat. Überprüfen Sie die Versionen der Bibliotheken, auf die Sie verweisen. Sehen Sie, ob jemand eine andere web.config hat. Ggf. an beiden Stellen den Code durchgehen.

Ich weiß nicht, was es ist, aber ich bin zu 90% sicher, dass Sie feststellen werden, dass Sie unterschiedliche Verhaltensweisen bekommen, weil Sie etwas etwas anderes ausführen.

+0

Ich verstehe, dass, da wir den gleichen Code haben, wahrscheinlich das Problem in einer Art von Konfiguration ist, aber das ist, was ich suche, Ideen oder Vorschläge, welche Konfigurationen die Datenzuordnung beeinflussen könnten. –

+0

Ich stimme @ScottHannen zu und bezweifle, dass es sich um ein Konfigurationsproblem handelt. Wahrscheinlicher ist ein Bereitstellungsproblem, bei dem die Anwendung, die Sie ausführen, nicht aus dem Code stammt, den Sie in Ihrer IDE sehen (auf Ihrem Computer oder in den anderen). Das kann leicht gesehen werden, indem versucht wird, den Code von der IDE aus zu debuggen (auf jeder Maschine), und zu sehen, ob das anders kommt (wenn es eine andere Quelle ist, sind Ihre Breakpoints leer, wenn Sie Visual Studio verwenden) oder versuchen zu machen einige bemerkenswerte Änderungen innerhalb der Klasse, die Sie versuchen zu tun (machen Sie ein Protokoll in eine Datei, wenn die Methode zum Beispiel eintritt) – Jcl

+0

@Jcl Ich habe versucht, durch zu gehen, aber das eigentliche Problem ist, dass die Ausnahme durch die automatische Zuordnung von geworfen wird JSON zu C# -Objekt; genauer gesagt versucht die POST-Methode von web api auf das Mitglied (das beim Zugriff auf die Ausnahme Zugriff hat) in seiner Abbildung auf den Eingabeparameter zuzugreifen. (z. B. 'public type POST (BasicModel input)' löst eine Ausnahme beim Erstellen von 'input' aus) Ich bin nicht sicher, wie ich auf diesen Prozess zugreifen kann, um zu sehen, was passiert. –

0

Überprüfen Sie die break on exceptions Einstellungen in Ihrem Visual Studio und den anderen Benutzern. Vielleicht wirft es die gleiche Ausnahme auf ihren Computern, aber Visual Studio ignoriert es, weil es behandelt wird. Das wäre ein Umweltunterschied, der nichts mit dem Code oder der Konfiguration zu tun hat.

+0

Sie haben auch mit Haltepunkten versucht und bestätigt, dass für sie nur die 'get()' für die Eigenschaften, die aus JSON deserialisiert werden, aufgerufen werden, und die anderen (die einmal für mich aufgerufen werden) nicht. –

Verwandte Themen