WCF, Streaming, Nachrichtenvertragsfehler: Fehler beim Deserialisieren des Nachrichtentexts der Anforderungsnachricht

Ich habe eine etwas komplizierte WCF-Service-Methode entwickelt. Ich möchte den Streaming-Übertragungsmodus verwenden, und da ich mehr als einen Parameter habe, habe ich einen MessageContract mit einem Body und einem Header definiert.

[MessageContract]
public class ReportAudioMessage
{
    [MessageHeader]
    public int ReportId;

    [MessageHeader]
    public string FileName;

    [MessageHeader]
    public int FileLengthInBytes;

    [MessageHeader]
    public int LengthInSeconds;

    [MessageBodyMember]
    public Stream ReportAudio;
}

Beachten Sie, dass der Stream das einzige Mitglied des Körpers ist, gemäß den Richtlinien, die ich in MSDN gelesen habe.

Die Methode ist wie folgt definiert:

    [OperationContract]
    void SaveReportAudio(ReportAudioMessage reportToSave);

Wenn ich versuche, die Methode (mithilfe von Reflektion) aufzurufen, erhalte ich eine Fehlermeldung:

Fehler beim Deserialisieren des Hauptteils der Anforderungsnachricht für die Operation 'SaveReportAudio'. OperationFormatter hat einen ungültigen Nachrichtentext festgestellt. Es wird erwartet, dass der Knotentyp 'Element' mit dem Namen 'SaveReportAudio' und dem Namespace 'gefunden wird.http://tempuri.org/'. Gefundener Knotentyp 'Element' mit Name 'ReportAudioMessage' und Namespace 'http://tempuri.org/'

SaveReportAudio ist der Name der Dienstmethode, die ich aufrufe. ReportAudioMessage ist der Name des definierten MessageContract. Es ist klar, dass meine Soap Message kaputt geht, aber ich weiß nicht wie ... :(

Der folgende Knoten ist das Dienstmodell in der Webkonfiguration des Dienstes:

<system.serviceModel>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="false" />
    <bindings>
        <netTcpBinding>
            <binding
             name="VRManagerTcpBinding"
             closeTimeout="00:01:00"
             openTimeout="00:01:00"
             sendTi,meout="00:01:00"
             receiveTimeout="00:01:00"
             transferMode="Streamed">
                <reliableSession enabled="false"/>
                <security mode="None" />
            </binding>
        </netTcpBinding>
    </bindings>
    <services>
        <service name="Radia.VoiceRecognition.Services.VRManager" behaviorConfiguration="VRManagerTcpBehavior">
            <host>
                <baseAddresses>
                    <add baseAddress="net.tcp://localhost:8011/VRManager"/>
                </baseAddresses>
            </host>
            <endpoint
             address="VRManager.svc"
             binding="netTcpBinding"
             bindingConfiguration="VRManagerTcpBinding"
             contract="Radia.VoiceRecognition.Services.IVRManager" />
            <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" />
        </service>
    </services>
    <behaviors>
       <serviceBehaviors>
        <behavior name="VRManagerTcpBehavior">
         <serviceMetadata httpGetEnabled="false" />
         <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior> 
       </serviceBehaviors>
      </behaviors>
</system.serviceModel>

Und hier ist der Service Model-Knoten der Client-App.Config:

<system.serviceModel>
<bindings>
  <netTcpBinding>
    <binding name="NetTcpBinding_IVRManager" closeTimeout="00:01:00"
      openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
      transactionFlow="false" transferMode="Streamed" transactionProtocol="OleTransactions"
      hostNameComparisonMode="StrongWildcard" listenBacklog="10" maxBufferPoolSize="524288"
      maxBufferSize="65536" maxConnections="10" maxReceivedMessageSize="65536">
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
      <reliableSession ordered="true" inactivityTimeout="00:10:00"
        enabled="false" />
      <security mode="None">
        <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" />
        <message clientCredentialType="Windows" />
      </security>
    </binding>
  </netTcpBinding>
</bindings>
<client>
  <endpoint address="net.tcp://xxxxxxxxxxx:8012/VRManager.svc/VRManager.svc"
    binding="netTcpBinding" bindingConfiguration="NetTcpBinding_IVRManager"
    contract="VRManager.IVRManager" name="NetTcpBinding_IVRManager" />
</client>

Antworten auf die Frage(1)

Ihre Antwort auf die Frage