Domanda

Sto cercando di utilizzare il WCF streaming con contratti di messaggio, perché ho bisogno di parametri aggiuntivi accanto al torrente stesso.

In sostanza sto creando un servizio di caricamento e scaricamento dei file, con una certa logica addizionale sulla parte superiore.

Purtroppo, quando cerco di colpire il servizio dal browser per controllare che tutto sia a posto, ottengo il seguente errore:

Errore del server in '/' applicazione. Operazione 'UploadFile' a contratto 'IFileTransferService' utilizza un MessageContract che ha header SOAP. intestazioni SOAP non sono supportati dal Nessuno MessageVersion.

Purtroppo googling per esso non ha dato alcun risultato significativo che mi ha aiutato. Puoi ragazzi hanno darmi una mano? Qui i dettagli del servizio (ho rimosso la parte di download per ragioni di spazio).

[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;
}

Ho provato ad utilizzare sia BasicHttpBinding e customhttp vincolante con effetto non positivo:

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

Aggiorna : la lettura della documentazione in linea, sembra che lo streaming con MessageContracts dovrebbe effettivamente essere possibile. Fare riferimento ad esempio a MSDN ( di grandi dimensioni Data e Streaming ):

  

modello di programmazione per i trasferimenti in streaming

     

Il modello di programmazione per lo streaming è   semplice. per la ricezione   i dati in streaming, specificano un'operazione   contratto che ha un unico flusso   parametro di input digitato. per la restituzione   i dati in streaming, restituiscono un flusso   riferimento. [...] Questa regola simile   si applica ai contratti di messaggi. Come mostrato   il seguente contratto di messaggio,   può avere solo un singolo elemento di corpo in   il contratto messaggio che è un   ruscello. Se si desidera comunicare   informazioni aggiuntive con la   streaming, queste informazioni devono essere un   portato in intestazioni dei messaggi. Il   corpo del messaggio è riservato esclusivamente   per il contenuto flusso.

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

Ho visto anche i post del blog da parte di persone compiendo servizi di upload di file e scaricare molto simile a quello che sto cercando di mettere insieme (ad esempio qui ).

UPDATE 2 Ho provato a generare una piccola console e auto che ospita il servizio con un basicHttpBinding e lì funziona come un fascino. Sto iniziando a credere che il problema potrebbe essere l'hosting su IIS. Qualche idea?

UPDATE 3 Vedere la mia risposta.

È stato utile?

Soluzione

Alla fine ho scoperto che cosa era l'errore: non aveva niente a che fare con le versioni sapone, ruscelli, ecc ... Ho appena mispelled il nome del mio proprio servizio, utilizzando FileTransfer invece di FileTransferService (!).

Nel basicHttpBinding fine era perfettamente bene, non ho bisogno di ricorrere ad un legame personalizzato.

Original (male) Versione:

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

La nuova versione (fisso):

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

Ancora non posso dire che il messaggio di errore era disponibile in qualsiasi modo per capire cosa stava succedendo qui ....

Se siete interessati in tutto il servizio, è possibile trovare maggiori dettagli sul mio blog al seguente link: File Transfer con WCF

Altri suggerimenti

Avete bisogno di streaming (cioè il trasferimento di somme di dati humonguous) sia in merito alla richiesta e la risposta? O semplicemente sulla risposta (in genere: il download di un file o di grande insieme di dati)?

Se è necessario solo sulla risposta, si dovrebbe cercare di impostare il transferMode a "StreamedResponse":

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

L'impostazione "streaming" sarà in streaming in entrambe le direzioni - sia la richiesta di andare al server, così come la risposta del server, sarà trasmesso in streaming. Più spesso che no, non è questo lo scenario ideale.

Marc

ho ottenuto l'errore dopo aver utilizzato il modello di 'WCF Data Service' per generare il file SVC invece di modello del 'WCF Service'. Correzione del file host di servizio il problema è stato risolto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top