2009-08-30 16 views
26

Qualcuno sa, o meglio ancora ha un esempio, di un servizio WCF che accetterà un modulo post codificato multipart/form-data ie. un caricamento di file da una pagina Web?Servizio WCF per accettare un postparticipato multipart/form-data

Sono arrivato vuoto su google.

Ta, Formica

+0

Vedere la mia risposta qui: http://stackoverflow.com/a/21689347/67824 –

+0

Questo collegamento funziona per me, spero che ne abbiate un'idea. http://stackoverflow.com/questions/7460088/reading-file-input-from-a-multipart-form-data-post/14514351#14514351 –

risposta

57

Quindi, qui va ...

Crea il tuo contratto di servizio, che un'operazione che accetta un flusso per il suo unico parametro, decorare con WebInvoke come di seguito

[ServiceContract] 
public interface IService1 { 

    [OperationContract] 
    [WebInvoke(
     Method = "POST", 
     BodyStyle = WebMessageBodyStyle.Bare, 
     UriTemplate = "/Upload")] 
    void Upload(Stream data); 

} 

Creare il classe ...

public class Service1 : IService1 { 

    public void Upload(Stream data) { 

     // Get header info from WebOperationContext.Current.IncomingRequest.Headers 
     // open and decode the multipart data, save to the desired place 
    } 

E la configurazione, per accettare in streaming dati, e la dimensione massima

<system.serviceModel> 
    <bindings> 
    <webHttpBinding> 
     <binding name="WebConfiguration" 
       maxBufferSize="65536" 
       maxReceivedMessageSize="2000000000" 
       transferMode="Streamed"> 
     </binding> 
    </webHttpBinding> 
    </bindings> 
    <behaviors> 
    <endpointBehaviors> 
     <behavior name="WebBehavior"> 
     <webHttp />   
     </behavior> 
    </endpointBehaviors> 
    <serviceBehaviors> 
     <behavior name="Sandbox.WCFUpload.Web.Service1Behavior"> 
     <serviceMetadata httpGetEnabled="true" httpGetUrl="" /> 
     <serviceDebug includeExceptionDetailInFaults="false" /> 
     </behavior> 
    </serviceBehaviors> 
    </behaviors> 
    <services>  
    <service name="Sandbox.WCFUpload.Web.Service1" behaviorConfiguration="Sandbox.WCFUpload.Web.Service1Behavior"> 
     <endpoint 
     address="" 
     binding="webHttpBinding" 
     behaviorConfiguration="WebBehavior" 
     bindingConfiguration="WebConfiguration" 
     contract="Sandbox.WCFUpload.Web.IService1" /> 
    </service> 
    </services> 
</system.serviceModel> 

Anche nel System.Web aumentano la quantità di dati consentita in System.Web

<system.web> 
     <otherStuff>...</otherStuff> 
     <httpRuntime maxRequestLength="2000000"/> 
</system.web> 

Questo è solo le basi, ma consente l'aggiunta di un progresso metodo per mostrare una barra di avanzamento ajax e potresti voler aggiungere un po 'di sicurezza.

+2

Come rimuovere tutta la spazzatura che viene inviata con lo Stream come: Content-Disposition :, Content-Type: etc ... Sto cercando di farlo funzionare per le immagini. Inoltre, perché non ci sono altri parametri nella definizione del contratto – Adam

+0

qualche idea su come ottenere questo lavoro con il sapone ??? – Gluip

1

io non so esattamente cosa si sta cercando di realizzare qui, ma non c'è il supporto incorporato in "classico" WCF basato su SOAP per catturare e gestire i dati del modulo postali. Dovrai farlo tu stesso.

D'altra parte, se si sta parlando di WCF basato su REST con webHttpBinding, si potrebbe certamente disporre di metodi di servizio decorati con l'attributo [WebInvoke()] che verrebbe chiamato con un metodo HTTP POST .

[WebInvoke(Method="POST", UriTemplate="....")] 
    public string PostHandler(int value) 

Il modello URI definirà l'URI da utilizzare dove deve essere il POST HTTP. Dovresti collegarlo al modulo ASP.NET (o qualsiasi altra cosa tu stia utilizzando per fare effettivamente il post).

Per un'eccellente introduzione allo stile WCF di REST, consulta lo screen cast series di Aaron Skonnard sullo Starter Kit WCF REST e su come utilizzarlo.

Marc

+1

Hi Marc, Sto volendo avere un servizio wcf riposante che può accettare i dati inviati da un modulo html che contiene un [tipo di input = file /]. Sono stato in grado di inviare un modulo senza file. Non voglio un'app client solo per il browser, quindi non posso convertire il file in un flusso di byte, sarà un post http di multipart/form-data –