【问题标题】:How to handle large file uploads via WCF?如何通过 WCF 处理大文件上传?
【发布时间】:2010-12-28 10:45:12
【问题描述】:

我正在考虑将 WCF 用于需要人们能够将大文件 (64MB-1GB) 上传到我的服务器的项目。我将如何使用 WCF 处理这个问题,可能还有恢复上传的能力。

为了处理更大的客户群,我想通过 WCF 测试 JSON。这将如何影响文件上传?可以从 JSON 完成,还是他们需要切换到 REST 来进行上传?

【问题讨论】:

    标签: c# wcf json large-file-upload


    【解决方案1】:

    您可以将 webHttpBinding 与 TransferMode 流式传输和单个 Stream 参数或 Stream 响应(视情况而定)一起用于大文件上传/下载,但您必须通过 URL 和/或标头发送任何请求元数据,除非您是将在 Stream 上设计自己的框架。但是,您必须构建一个自定义的非 HTML 客户端(如 Silverlight、Flash 等),因为浏览器不支持对本地文件的随机访问,并且正常的文件上传将是表单发布,而不是 JSON。

    【讨论】:

      【解决方案2】:

      MTOM 已针对处理大型二进制数据进行了优化。

      【讨论】:

      • MTOM 本身并没有太大帮助 - 您仍然需要将整个消息组装在缓冲区中以进行传输。
      【解决方案3】:

      如果你想上传大文件,你肯定需要查看WCF Streaming Mode

      基本上,您可以更改绑定上的传输模式;默认情况下,它是缓冲的,即整个消息需要在发送者上缓冲,序列化,然后作为一个整体传输。

      使用流式传输,您可以定义单向流式传输(仅用于上传,仅用于下载)或双向流式传输。这是通过将绑定的 transferMode 设置为 StreamedRequestStreamedResponse 或简单的 Streamed 来完成的。

      <bindings>
         <basicHttpBinding>
            <binding name="HttpStreaming" 
                     maxReceivedMessageSize="2000000"
                     transferMode="StreamedRequest"/>
         </basicHttpBinding>
      </bindings>
      

      那么你需要有一个服务合约,它要么接收Stream 类型的参数(用于上传),要么返回Stream 类型的值(用于下载)。

      [ServiceContract]
      public interface IFileUpload
      {
          [OperationContract]
          bool UploadFile(Stream stream);
      }
      

      应该这样做!

      【讨论】:

      • 如果您的请求/响应必须遵循特定模式怎么办?即,如果请求必须是特定对象,并且您的 wsdl 需要反映这一点?您将如何通过流强制执行此操作?
      • @Jeremy:正如我的回复所说:如果您想使用流传输,您可以使用Stream 类型的单个参数(或返回值类型Stream)。如果您不能像这样设计您的服务并且必须遵循其他特定要求,那么很遗憾,您就不能使用流传输。没有神奇的方法可以完成这项工作。
      • @marc_s 单个大字符串参数怎么样? My recent question 被标记为重复,但我可以通过设置正确的参数轻松传递 1.2gb byte[] 参数到方法没有问题但是如果你将参数类型从 byte[] 更改为 string 那么它限制为大约 28 mb。我必须有 string 作为参数。
      • @marc_s: 来自 MSDN:参数和返回值的类型必须至少是 Stream 来自文章:How to: Enable Streaming 我不认为有字符串类型的参数是必需的,我们可以有其他输入参数。这是反过来吗?
      猜你喜欢
      • 1970-01-01
      • 2015-11-14
      • 2017-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-09
      相关资源
      最近更新 更多