【问题标题】:WCF service to accept a post encoded multipart/form-dataWCF 服务接受后编码的多部分/表单数据
【发布时间】:2010-11-24 04:40:28
【问题描述】:

有谁知道,或者最好有一个 WCF 服务的例子,它将接受编码为multipart/form-data 的表单帖子,即。从网页上传文件?

我在谷歌上空了。

蚂蚁,蚂蚁

【问题讨论】:

标签: html wcf http


【解决方案1】:

那么,就这样吧……

创建您的服务合同,该合同接受一个流作为其唯一参数的操作,使用 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 进度条,您可能需要添加一些安全性。

【讨论】:

  • 如何删除所有与 Stream 一起发送的垃圾,例如:Content-Disposition:、Content-Type: 等...我正在尝试让它适用于图像。还有为什么合同定义中不能有任何其他参数
【解决方案2】:

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

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

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

URI 模板将定义 URI 以使用 HTTP POST 应该去的地方。您必须将其连接到您的 ASP.NET 表单(或您实际用于发布帖子的任何内容)。

有关 REST 样式 WCF 的精彩介绍,请查看 Aaron Skonnard 在 WCF REST Starter Kit 上的 screen cast series 以及如何使用它。

马克

【讨论】:

  • 嗨,Marc,我想要一个安静的 wcf 服务,它可以接受来自 html 表单的发布数据,其中包含 [input type=file /]。我已经能够发布一个没有文件的表单。我不想要一个客户端应用程序只是浏览器,所以我无法将文件转换为字节流,它将是一个 multipart/form-data http post
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-04
  • 2013-06-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多