2009-08-30 6 views
26

Est-ce que quelqu'un sait, ou mieux encore a un exemple, d'un service WCF qui acceptera un post de format codé multipart/form-data ie. un téléchargement de fichier à partir d'une page Web?Le service WCF accepte une multipart/form-data post-codée

Je suis venu vide sur google.

Ta, Ant

+0

Voir ma réponse ici: http://stackoverflow.com/a/21689347/67824 –

+0

Ce lien fonctionne pour moi, j'espère que vous en aurez une idée. http://stackoverflow.com/questions/7460088/reading-file-input-from-a-multipart-form-data-post/14514351#14514351 –

Répondre

57

Alors, ici va ...

Créer votre contrat de service qui une opération qui accepte un flux pour son seul paramètre, décorer avec WebInvoke comme ci-dessous

[ServiceContract] 
public interface IService1 { 

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

} 

Créer la 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 
    } 

Et la config, pour accepter en streaming données et la taille maximale

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

également dans le System.Web augmentent la quantité de données autorisée dans System.Web

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

Ceci est juste l'essentiel, mais permet l'ajout d'un progrès méthode pour afficher une barre de progression ajax et vous voudrez peut-être ajouter un peu de sécurité.

+2

Comment supprimer tous les déchets qui sont envoyés avec le flux comme: Content-Disposition :, Content-Type: etc ... J'essaie de faire fonctionner cela pour les images. Aussi, pourquoi pas d'autres paramètres dans la définition du contrat – Adam

+0

des idées comment obtenir ce travail avec du savon ??? – Gluip

1

Je ne sais pas exactement ce que vous essayez d'accomplir, mais il n'y a pas de support intégré dans WCF à base de SOAP « classique » pour capturer et traiter les données post de formulaire. Vous devrez le faire vous-même. D'un autre côté, si vous parlez de WCF basé sur REST avec le webHttpBinding, vous pouvez certainement avoir une méthode de service qui est décorée avec l'attribut [WebInvoke()] qui sera appelé avec une méthode HTTP POST . Le modèle d'URI définira l'URI à utiliser là où le HTTP POST devrait aller. Vous devrez raccorder cela à votre formulaire ASP.NET (ou à tout ce que vous utilisez pour faire le post).

Pour une excellente introduction au style WCF REST, consultez le screen cast series d'Aaron Skonnard sur le kit de démarrage WCF REST et comment l'utiliser.

Marc

+1

Salut Marc, Je veux avoir un service wcf reposant qui peut accepter les données publiées à partir d'un formulaire html qui contient un [input type = file /]. J'ai été en mesure de poster un formulaire sans les fichiers. Je ne veux pas une application cliente juste le navigateur, donc je ne peux pas convertir le fichier en un flux d'octets, ce sera un poste multipart/form-données http –