[ACCEPTED]-WCF service to accept a post encoded multipart/form-data-http

Accepted answer
Score: 62

So, here goes...

Create your service contract 9 which an operation which accepts a stream 8 for its only parameter, decorate with WebInvoke 7 as below

[ServiceContract]
public interface IService1 {

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

}

Create the class...

    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
    }

And the config, to 6 accept streamed data, and the maximum size

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

Also 5 in the System.Web increase the amount of 4 data allowed in System.Web

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

This is just the 3 basics, but allows for the addition of a 2 Progress method to show an ajax progress 1 bar and you may want to add some security.

Score: 1

I don't exactly know what you're trying 16 to accomplish here, but there's no built-in 15 support in "classic" SOAP-based 14 WCF to capture and handle form post data. You'll 13 have to do that yourself.

On the other hand, if 12 you're talking about REST-based WCF with 11 the webHttpBinding, you could certainly 10 have a service methods that is decorated 9 with the [WebInvoke()] attribute which would 8 be called with a HTTP POST method.

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

The URI 7 template would define the URI to use where 6 the HTTP POST should go. You'd have to hook 5 that up to your ASP.NET form (or whatever 4 you're using to actually do the post).

For 3 a great introduction to REST style WCF, check 2 out Aaron Skonnard's screen cast series on the WCF REST Starter 1 Kit and how to use it.

Marc

More Related questions