Frage

Ich versuche, die WCF verwenden Streaming mit Message Verträge, weil ich neben dem Stream zusätzliche Parameter müssen selbst.

Im Grunde Ich erstelle eine Datei-Upload und Download-Service, mit einigen zusätzlichen Logik auf.

Leider, wenn ich versuche, den Dienst aus dem Browser zu treffen, dass alles zu prüfen, ist alles in Ordnung, ich die folgende Fehlermeldung erhalten:

Serverfehler in der Anwendung '/'. Operation ‚Upload‘ in Auftrag ‚IFileTransferService‘ verwendet eine Message, die SOAP-Header hat. SOAP-Header werden nicht durch die None Message unterstützt.

googeln Leider für sie kein signifikantes Ergebnis brachten, die mir geholfen. Können Sie Jungs haben mir heraus helfen? Hier wird die Details des Dienstes (ich habe den Download-Teil aus Gründen des Raumes entfernt).

[ServiceContract(Namespace = "http://www.acme.org/2009/04")]
public interface IFileTransferService
{
    [OperationContract(Action = "UploadFile")]
    void UploadFile(FileUploadMessage request);
}

[MessageContract]
public class FileUploadMessage
{
    [MessageHeader(MustUnderstand = true)]
    public FileMetaData Metadata { get; set; }

    [MessageBodyMember(Order = 1)]
    public Stream FileByteStream { get; set; }
}

[DataContract(Namespace = "http://schemas.acme.org/2009/04")]
public class FileMetaData
{
    [DataMember(Name="FileType", Order=0, IsRequired=true)]
    public FileTypeEnum fileType;

    [DataMember(Name="localFilename", Order=1, IsRequired=false)]
    public string localFileName;

    [DataMember(Name = "remoteFilename", Order = 2, IsRequired = false)]
    public string remoteFileName;
}

Ich habe versucht, sowohl das Basichttpbinding und eine customhttp zu verwenden, um mit nicht positiv Bindung:

<customBinding>
    <binding name="customHttpBindingStream">
        <textMessageEncoding messageVersion="Soap12" />
        <httpTransport transferMode="Streamed" maxReceivedMessageSize="2147483647"/>
    </binding>
</customBinding>

UPDATE : Lesen der Online-Dokumentation scheint es, dass MessageContracts mit Streaming in der Tat möglich sein sollte. Siehe zum Beispiel auf MSDN ( Großen Daten und Streaming ):

  

Programmierung Modell für gestreamte Transfer

     

Das Programmiermodell für das Streaming ist   einfach. Für den Empfang   gestreamten Daten geben einen Betrieb   Vertrag, der einen einzelnen Stream hat   typisierten Eingabeparameter. für die Wieder   gestreamten Daten, liefern einen Strom   Referenz. [...] Diese Regel ähnlich   gilt für Nachrichtenverträge. Wie gezeigt   in der folgenden Meldung Vertrag, Sie   nur ein einziges Körperteil kann in   Ihre Nachricht Vertrag, der eine ist   Strom. Wenn Sie möchten, kommunizieren,   Zusätzliche Informationen mit der   streamen, diese Informationen müssen ein   in Nachrichtenkopfzeilen ausgeführt. Das   Nachrichtentext ist ausschließlich reserviert   für den Strom Inhalt.

[MessageContract]
public class UploadStreamMessage
{
   [MessageHeader]
   public string appRef;
   [MessageBodyMember]
   public Stream data;
} 

Ich habe auch Blog-Posts von Menschen erreichen Dienste von Datei-Upload und Download sehr ähnlich zu dem, was ich zusammen bin versucht zu sehen (zum Beispiel hier ).

UPDATE 2 Ich habe versucht, eine kleine Konsole zu schaffen und selbst den Dienst mit einem Basichttpbinding-Hosting und es funktioniert es wie ein Zauber. Ich beginne zu glauben, dass das Problem könnte das Hosting auf IIS sein. Jede Idee?

UPDATE 3 Siehe meine eigene Antwort.

War es hilfreich?

Lösung

ich endlich herausgefunden, was war der Fehler: es hat nichts mit Soap-Versionen, Bäche zu tun hatte, etc ... Ich mispelled nur den Namen meines eigenen Dienst, mit FileTransfer statt FileTransferService (!).

Am Ende Basichttpbinding war völlig in Ordnung, ich brauchte nicht zu einem benutzerdefinierten greifen zu binden.

Original (sehr schlecht) Version:

<service 
    behaviorConfiguration="serviceBehavior"
    name="Acme.Service.FileTransfer">
    <endpoint address="" 
        name="basicHttpStream" 
        binding="basicHttpBinding"
        bindingConfiguration="httpLargeMessageStream" 
        contract="Acme.Service.IFileTransferService" />
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>

Neu (fest) Version:

<service 
    behaviorConfiguration="serviceBehavior"
    name="Acme.Service.FileTransferService">
    <endpoint address="" 
        name="basicHttpStream" 
        binding="basicHttpBinding"
        bindingConfiguration="httpLargeMessageStream" 
        contract="Acme.Service.IFileTransferService" />
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>

Noch kann ich nicht sagen, dass die Fehlermeldung in irgendeiner Weise hilfreich war zu verstehen, was hier los war ....

File Transfer mit WCF

Andere Tipps

Haben Sie brauchen Streaming (das heißt Übertragung von humonguous Datenmengen), die beide auf der Anfrage und Antwort? Oder einfach nur auf die Antwort (in der Regel: eine Datei oder einen großen Datensatz Download)?

Wenn Sie auf der Antwort nur benötigen, sollten Sie versuchen, den transfer auf „StreamedResponse“ zu setzen:

<customBinding>
    <binding name="customHttpBindingStream">
        <textMessageEncoding messageVersion="Soap12" />
        <httpTransport transferMode="StreamedResponse" 
                       maxReceivedMessageSize="2147483647"/>
    </binding>
</customBinding>

Die „gestreamte“ -Einstellung wird in beide Richtungen strömen - sowohl die Anfrage an den Server gehen, sowie die Antwort des Servers wird, übertragen werden. Mehr als oft nicht, das ist nicht das ideale Szenario.

Marc

habe ich den Fehler nach dem ‚WCF Data Service‘ Vorlage mit der SVC-Datei anstelle des ‚WCF-Dienst‘ Vorlage zu generieren. Korrektur der Service-Host-Datei wurde das Problem gelöst.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top