我正在考虑将 WCF 用于需要人们能够将大文件 (64MB-1GB) 上传到我的服务器的项目。我将如何使用 WCF 处理这个问题,可能还有恢复上传的能力。
为了处理更大的客户群,我想通过 WCF 测试 JSON。这将如何影响文件上传?可以从 JSON 完成,还是他们需要切换到 REST 进行上传部分?
我正在考虑将 WCF 用于需要人们能够将大文件 (64MB-1GB) 上传到我的服务器的项目。我将如何使用 WCF 处理这个问题,可能还有恢复上传的能力。
为了处理更大的客户群,我想通过 WCF 测试 JSON。这将如何影响文件上传?可以从 JSON 完成,还是他们需要切换到 REST 进行上传部分?
如果你想上传大文件,你肯定需要查看WCF Streaming Mode。
基本上,您可以更改绑定上的传输模式;默认情况下,它是缓冲的,即整个消息需要在发送者上缓冲,序列化,然后作为一个整体传输。
使用流式传输,您可以定义单向流式传输(仅用于上传,仅用于下载)或双向流式传输。这是通过将绑定的 transferMode 设置为StreamedRequest
,StreamedResponse
或只是 plain来完成的Streamed
。
<bindings>
<basicHttpBinding>
<binding name="HttpStreaming"
maxReceivedMessageSize="2000000"
transferMode="StreamedRequest"/>
</basicHttpBinding>
</bindings>
然后,您需要有一个服务合同,它要么接收类型参数Stream
(用于上传),要么返回类型值Stream
(用于下载)。
[ServiceContract]
public interface IFileUpload
{
[OperationContract]
bool UploadFile(Stream stream);
}
应该这样做!
MTOM已针对处理大型二进制数据进行了优化。
您可以将 webHttpBinding 与 TransferMode 流式传输和单个 Stream 参数或 Stream 响应(视情况而定)一起用于大文件上传/下载,但您必须通过 URL 和/或标头发送任何请求元数据,除非您要设计您自己在 Stream 上的取景。但是,您必须构建一个自定义的非 HTML 客户端(如 Silverlight、Flash 等),因为浏览器不支持对本地文件的随机访问,并且正常的文件上传将是表单发布,而不是 JSON。