Ich habe einen WCF Service der mir aus einem übermitteltem Stream eine Objekt erzeugt. Das fuktioniert auch soweit.
Wenn ich allerdings das so erzeugte Objekte als Stream zum Client übermitteln will, erhalte ich folgende Fehlermeldung am Client:
"Der Inhaltstyp "text/html" der Antwortnachricht stimmt nicht mit dem Inhaltstyp der Bindung (multipyrt/related; type="application/xop+xml") überein..."
Die Methode auf dem Server zum konvertieren des Streams, erstellen des Objektes, serialisieren in einen neuen Stream und zurückgeben sieht folgendermaßen aus:
public Stream CreateDataObjectsFromStream(Stream dataStream) { try { Byte[] buffer = new byte[dataStream.Length]; dataStream.Read(buffer, 0, (int)dataStream.Length);
var bufferString= GetStringFromByteArray(buffer);
var bufferArray = bufferString.ToString().Split(";".ToCharArray());
// Erstellen des neuen Objecktes (myObject) anhand der Daten in BufferArray
MemoryStream memStream = new MemoryStream(); BinaryFormatter binaryFormatter = new BinaryFormatter();
Die Fehlermeldung weist auf die notwendige Implemtierung der IsContentTypeSupported-Methode hin, sofern ein eigener Encoder verwendet wird. Dies ist allerdings nicht der Fall bei mir.
Eventuell ist das ja auch ein ganz falscher Ansatz!? Bin relativ neu in der Materie WCF und versuche mich anhand dieses Projektes eingehender damit zu beschäftigen.
Bin für jeden Ratschlag, jede Hilfestellung dankbar.
auf dem Server wird MTOM beim Binding eingestellt, beim Client nicht, und daher passt das nicht zusammen. D.h. beim Client muss auch das binding-Element angegeben werden.
Den Zweck von CreateDataObjectsFromStream verstehe ich nicht ganz, du könntest doch den Stream direkt weitergeben, oder übersehe ich das was?
Was genau meinst du, mit "...beim Client muss auch das binding-Element angeben werden."? Bzw. wo genau mache ich das?
Der Stream, welcher der Methode übergeben wird, enhält den Inhalt einer CSV Datei. Die einzelnen, durch ein Trennzeichen separierten Elemente, werden in ein definiertes Klassenobjekt übergeben. Die Objekte wiederum befinden sich in einer Liste.
Diese Liste soll am Ende an den Client zurückgeschickt werden.
Ich hoffe das war vielleicht etwas verständlicher. :)
Wie ich schon geschrieben hab, vielleicht ist das ja auch der falsche Ansatz?!
ja verständlicher :-) Warum jedoch die Liste als Stream übergeben wird verstehe ich nicht. So hat es keinen Vorteil durch Streaming (nur mehr Aufwand) und ein List<T> als Rückagabewerte wäre einfacher.
In der Client-app.config muss auch das <binding> aus der Server-app.config rein. Sonst weiß der Client nämlich nicht dass als messageEncoding MTOM verwendet wird, bzw. allgemeiner hat der Client keine Ahnung wie das Binding konfiguriert ist. Und das muss er wissen.
Anfänglich habe ich die Listen direkt übergeben. Allerdings hat das Ganze nur bis zu einer Zeilenanzahl in der CSV Datei von ca. 50 Zeilen funktioniert.
Erhöhen des maxReceivedMessageSize-Wertes hat keine Änderung gebracht.
Nach ein wenig Recherche bin ich halt auf die Streaming/MTOM Geschichte gestoßen.
Das Binding ist sowohl in der app.config als auch in der web.config vorhanden. Deswegen versteh ich ja nicht so ganz, warum es nicht funktioniert.
Ich bin mir zwar noch nicht sicher welcher Wert es genau war, werd ich noch prüfen, aber es funktioniert... Allerdings habe ich es noch mal dahingehend verändert, dass ich die Datei in kleinere Segmente unterteile und übergebe. Damit bin ich auch später bei sehr großen Dateien immer auf der sicheren Seite. Vielen Dank auf jeden Fall für deine Hilfe!
Der Stream, welcher der Methode übergeben wird, enhält den Inhalt einer CSV Datei. Die einzelnen, durch ein Trennzeichen separierten Elemente, werden in ein definiertes Klassenobjekt übergeben. Die Objekte wiederum befinden sich in einer Liste.
Diese Liste soll am Ende an den Client zurückgeschickt werden.
Ich hoffe das war vielleicht etwas verständlicher. :)
Wie ich schon geschrieben hab, vielleicht ist das ja auch der falsche Ansatz?!