| 

.NET C# Java Javascript Exception

3
Hallo zusammen,

folgendes Problem stellt sich mir gerade:

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..."

Das Binding auf Serverseite sieht so aus:

<basicHttpBinding>        
<binding name ="BasicHttpBinding_IMyService"
messageEncoding="Mtom"
transferMode="Streamed"
textEncoding="utf-8"
maxReceivedMessageSize="2147483647">
<security mode="None">
<transport clientCredentialType="None" proxyCredentialType="None"
realm="" />
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
</binding>
</basicHttpBinding>


Auf der Clientseite is eine identische Section vorhanden.

Der endpoint ist im Client folgendermaßen angegeben:

<client>
<endpoint address="http://myserver/MyService.svc"
binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_IMyService"
contract="MyService.IMyService"
name="BasicHttpBinding_IMyService"/>
</client>


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();

binaryFormatter.Serialize(memStream, myObject);

return memStream;
}
catch (Exception)
{
throw;
}
}


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.
18.11.2011
13thAngel 363 2 8
1 Antwort
1
Hallo,

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?

Ich weiß nicht genau was dein Service machen, aber eventuell hilft dir diese Streaming-Komponente für WCF weiter.

mfG Gü
18.11.2011
gfoidl 9,4k 3 5
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?!

13thAngel 18.11.2011
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.
gfoidl 18.11.2011
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.
13thAngel 21.11.2011
50 Zeilen sind nicht viel, erhöhe auch die anderen max*-Werte dann gehts.
Streaming ist für diese Aufgabe eher ungeeignet.
gfoidl 21.11.2011
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!
13thAngel 21.11.2011

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH