Служба WCF для приема многокомпонентных данных / данных формы - PullRequest
31 голосов
/ 30 августа 2009

Кто-нибудь знает, или, еще лучше, есть пример службы WCF, которая будет принимать форму с кодом multipart/form-data т.е. загрузка файла с веб-страницы?

Я пустил в Google.

Та, Муравей

Ответы [ 2 ]

60 голосов
/ 10 сентября 2009

Итак, поехали ...

Создайте свой контракт на обслуживание, который операция, которая принимает поток для своего единственного параметра, украсьте с помощью WebInvoke, как показано ниже

[ServiceContract]
public interface IService1 {

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

}

Создать класс ...

    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
    }

И конфиг, для приема потоковых данных, и максимальный размер

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

Также в System.Web увеличьте объем данных, разрешенных в System.Web

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

Это только основы, но позволяет добавить метод Progress для отображения индикатора выполнения AJAX, и вы можете захотеть добавить некоторую безопасность.

1 голос
/ 31 августа 2009

Я точно не знаю, чего вы здесь пытаетесь достичь, но в "классическом" WCF на основе SOAP нет встроенной поддержки для захвата и обработки данных постов формы. Тебе придется сделать это самому.

С другой стороны, если вы говорите о WCF на основе REST с webHttpBinding, у вас наверняка могут быть служебные методы, которые украшены атрибутом [WebInvoke ()], который будет вызываться методом HTTP POST.

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

Шаблон URI будет определять URI для использования, куда должен идти HTTP POST. Вам нужно подключить это к форме ASP.NET (или к тому, что вы используете для фактического создания сообщения).

Чтобы познакомиться с WCF-стилем в стиле REST, ознакомьтесь с серией скриншотов Аарона Сконнарда *1009* в стартовом наборе WCF REST и его использованием.

Марк

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...