2016-06-29 13 views
0

Ich benutze den neuen 2.X NEST Client. Dieser Teil ist wichtig, denn es gab sehr viele brechende Änderungen, die hier mögliche Antworten bewirken.Abrufen des Anfragekörpers der Suchantwort mit dem 2.X NEST Client

Zuvor habe ich das Glimpse Elasticsearch-Plugin verwendet, um die von NEST generierten zugrunde liegenden Abfragen anzuzeigen. Es scheint jedoch, dass dieses Plugin nicht mehr kompatibel mit 2.X NEST ist. Als Ergebnis versuche ich eine Problemumgehung zu finden, um die JSON-Abfrage zu sehen. Das Problem hier ist, dass die alte Art, auf response.RequestInformation zuzugreifen, um an den Anfragekörper zu gelangen, weg ist. Es scheint durch eine Kombination von ApiCall, CallDetails und DebugInformation ersetzt worden zu sein. Das Problem hierbei ist, dass in all diesen Feldern das Anforderungsbyte-Array null ist, es sei denn, Sie fügen .DisableDirectStreaming() der ConnectionSettings Instanz hinzu, die Sie an ElasticClient übergeben. Das Problem dort ist, dass ich alles mit der Abhängigkeitsinjektion mit Ninject handle. In so etwas wie einer Controller-Aktion habe ich keinen Zugriff auf die ConnectionSettings Instanz, um eine solche Änderung vorzunehmen. Ich nehme an, ich könnte einfach .DisableDirectStreaming() weltweit hinzufügen, aber ich habe keine Ahnung, was die möglichen Folgen davon sind, und die Dokumentation dazu ist frustrierend spärlich.

Also, es gibt ein paar Wege für eine Antwort hier, von denen ich alle akzeptieren werde. Erstens, wenn es jemand geschafft hat, das Glimpse-Plugin mit 2.X zu betreiben, würde ich gerne wissen, was Sie getan haben. Basierend auf der Tatsache, dass sich die zugrundeliegende API dramatisch verändert hat, gehe ich davon aus, dass das Plugin grundsätzlich kaputt ist, bis jemand es für 2.X abzweigt oder Elastic seine eigene Version herausbringt (die angeblich an einem unbestimmten Punkt in der Zukunft).

Zweitens, wenn es einen Weg gibt, um die Anfrage Körper zu bekommen, ohne Direct Streaming zu deaktivieren, und ich habe es einfach verpasst. Ich würde mich freuen Führung dort.

Drittens, wenn jemand irgendwelche Ideen für hat, wie ich direkten Streaming auf der Controller-Aktion Ebene deaktivieren kann, ohne meine Ninject Setup zu beeinflussen oder sie global anwenden, können Sie in läutet.

Schließlich wäre es toll, Wenn jemand vom Elastic-Team mich über die Auswirkungen der Deaktivierung des direkten Streaming aufklären kann und welche potenziellen Probleme daraus entstehen können, kann ich eine Entscheidung darüber treffen, ob es sinnvoll wäre, sie global anzuwenden oder nicht.

Antwort

2

Mit .DisableDirectStreaming() auf wahr gesetzt, wobei die Anforderung Bytes und Antwortbytes in Speicherströme gepuffert, damit sie auf die Reaktion über response.RequestBodyInBytes und response.ResponseBodyInBytes jeweils zur Verfügung stehen.

Standardmäßig ist es auf false gesetzt, so dass der Anforderungstyp z. SearchDescriptor<T>, SearchRequest<T> usw. wird direkt in den Anforderungsstrom der http-Anfrage serialisiert und in ähnlicher Weise wird der Antworttyp aus dem Antwortstream deserialisiert. Der Overhead, den es auf true setzt, hält daher die Anforderungs- und Antwortbytes im Speicher für die Lebensdauer der Antwort (und GC tritt ein).

Mit Verbindungseinstellungen ist es am besten, eine Instanz für die Lebensdauer der Anwendung zu haben; Serialisierungseinstellungen werden zwischen den Verbindungseinstellungen sowie Caches für Feld- und Eigenschaftsausdrücke zwischengespeichert. Es gibt derzeit keine Möglichkeit, die Request- und Response-Bytes auf einer pro-Request-Basis herum zu halten, d. H. Ad-hoc-Introspektion, aber ich denke, dies wäre eine nützliche Ergänzung; Ich werde ein Problem dafür hinzufügen :)

Ich bin persönlich nicht allzu vertraut mit der Glimpse-Integration, aber ich würde erwarten, dass es aufgrund einiger Änderungen eine Aktualisierung erforderlich wäre, um mit NEST 2.x zu arbeiten. Nachdem wir es kurz angeschaut haben, sehen die Änderungen ziemlich einfach aus.Scheinbar kann dies getan werden, ohne dass .DisableDirectStreaming() auf true festgelegt werden muss, aber nur die Anforderungsbytes gegriffen werden müssen, bevor sie in den Anforderungsstream geschrieben werden.

+0

Seit dieser Antwort ist es möglich, direktes Streaming pro Anfrage in NEST 5.x zu deaktivieren - wird sehen, ob es auf 2.x rückportiert werden kann –

+0

Für diejenigen, die diese Informationen suchen, können Sie es finden hier - https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/debug-information.html - der 'SearchDescriptor' akzeptiert' RequestConfiguration' –