WCF服务接受post编码的multipart / form-data

时间:2009-08-30 19:50:25

标签: html wcf http

是否有人知道或更好地拥有一个WCF服务的示例,该服务将接受编码multipart/form-data的表单帖子,即。从网页上传文件?

我在谷歌上空了。

Ta,Ant

2 个答案:

答案 0 :(得分:60)

所以,这里......

创建一个服务合同,该服务合同接受一个流作为其唯一参数的操作,用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 :(得分:1)

我并不确切知道你在这里要完成什么,但是在“经典”基于SOAP的WCF中没有内置支持来捕获和处理表单发布数据。你必须自己做。

另一方面,如果您正在使用webHttpBinding讨论基于REST的WCF,那么您当然可以使用[WebInvoke()]属性修饰的服务方法,该属性将使用HTTP POST方法调用。

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

URI模板将定义HTTP POST应该使用的URI。你必须把它连接到你的ASP.NET表单(或者你用来实际发布的任何内容)。

有关REST样式WCF的精彩介绍,请参阅WCF REST入门套件上的Aaron Skonnard的screen cast series以及如何使用它。

马克