WCF: mit Streaming mit Message Contracts
-
20-09-2019 - |
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.
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 WCFAndere 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.