J'essaie d'utiliser le streaming WCF avec les contrats de message, car j'ai besoin de paramètres supplémentaires à côté du flux lui-même. Fondamentalement, je crée un service de téléchargement et de téléchargement de fichiers, avec une logique supplémentaire sur le dessus.WCF: utilisation du streaming avec les contrats de message
Malheureusement, lorsque je tente de frapper le service du navigateur pour vérifier que tout va bien, je reçois l'erreur suivante:
Erreur du serveur dans l'application «/». L'opération 'UploadFile' dans le contrat 'IFileTransferService' utilise un MessageContract qui a des en-têtes SOAP. Les en-têtes SOAP ne sont pas pris en charge par None MessageVersion.
Malheureusement chercher sur ce site n'a donné aucun résultat significatif qui m'a aidé. Pouvez-vous m'aider? Voici les détails du service (j'ai supprimé la partie téléchargement pour raison d'espace).
[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;
}
J'ai essayé d'utiliser les deux BasicHttpBinding et un customhttp liant avec effet positif non:
<customBinding>
<binding name="customHttpBindingStream">
<textMessageEncoding messageVersion="Soap12" />
<httpTransport transferMode="Streamed" maxReceivedMessageSize="2147483647"/>
</binding>
</customBinding>
MISE À JOUR: la lecture de la documentation, il semble que le streaming en ligne avec MessageContracts devrait en effet être possible. Voir par exemple: MSDN (Large Data and Streaming):
Programming Model for Streamed Transfers
The programming model for streaming is straightforward. For receiving streamed data, specify an operation contract that has a single Stream typed input parameter. For returning streamed data, return a Stream reference. [...] This rule similarly applies to message contracts. As shown in the following message contract, you can have only a single body member in your message contract that is a stream. If you want to communicate additional information with the stream, this information must be a carried in message headers. The message body is exclusively reserved for the stream content.
[MessageContract]
public class UploadStreamMessage
{
[MessageHeader]
public string appRef;
[MessageBodyMember]
public Stream data;
}
J'ai aussi vu les messages de blog des personnes accomplissant des services de téléchargement de fichiers et télécharger très semblable à ce que je suis en train de mettre en place (par exemple here).
MISE À JOUR 2 J'ai essayé de créer une petite console et le service d'hébergement auto avec un basicHttpBinding et là, il fonctionne comme un charme. Je commence à croire que le problème pourrait être l'hébergement sur IIS. Une idée?
MISE À JOUR 3 Voir ma propre réponse.
Je crois que 'Order = 1' est redondant dans l'attribut' MessageBodyMember' car vous n'avez qu'un élément de corps –