Usługa WCF do akceptacji Post zakodowanego multipart/form-data

Czy ktoś zna, lub lepiej jeszcze Ma przykład, usługę WCF, która przyjmie formularz Post zakodowany multipart/form-data ie. przesyłanie plików ze strony internetowej?

Nie znalazłem nic w google.

Ta, Ant

Author: Tolga Evcimen, 2009-08-30

2 answers

No to zaczynamy...

Utwórz umowę serwisową, która jest operacją, która akceptuje strumień dla swojego jedynego parametru, udekoruj WebInvoke jak poniżej

[ServiceContract]
public interface IService1 {

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

}

Utwórz klasę...

    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
    }

I config, aby akceptować strumieniowane Dane i maksymalny rozmiar

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

Również w systemie.Www: Web

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

To tylko podstawy, ale pozwala na dodanie metody postępu, aby pokazać pasek postępu ajax i możesz dodać trochę zabezpieczeń.

 58
Author: Anthony Johnston,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-10 19:08:11

Nie wiem dokładnie, co próbujesz osiągnąć, ale nie ma wbudowanej obsługi w "klasycznym" WCF na bazie mydła do przechwytywania i obsługi danych z postów. Musisz to zrobić sam.

Z drugiej strony, jeśli mówisz o WCF opartym na REST z webHttpBinding, z pewnością możesz mieć metody usługowe, które są ozdobione atrybutem [WebInvoke ()], który byłby wywoływany metodą HTTP POST.

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

Szablon URI definiowałby URI do użycia gdzie powinien iść Post HTTP. Musisz to podłączyć do swojego ASP.NET formularz (lub cokolwiek używasz do faktycznie zrobić post).

Aby zapoznać się z doskonałym wprowadzeniem do WCF w stylu odpoczynku, sprawdź serię screen cast Aarona Skonnarda na zestawie startowym WCF Rest Starter Kit i jak go używać.

Marc

 1
Author: marc_s,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-30 21:07:56