2009-12-20 60 views
13

我正在调查使用WCF的项目,这将需要人们上传大文件(64MB-1GB)到我的服务器的能力。我将如何处理这与WCF,可能有能力恢复上传。如何通过WCF处理大文件上传?

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

回答

15

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

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

借助Streaming,您可以定义单向流式传输(仅用于上传,仅用于下载)或双向流式传输。这是通过将您的绑定的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); 
} 

应该这样做!

+0

如果您的请求/响应必须遵循特定的模式,该怎么办?也就是说,如果请求必须是特定的对象,并且您的wsdl需要反映该请求?你将如何用流实施? – Jeremy 2013-03-05 20:35:52

+0

@Jeremy:正如我的回应所说:如果您想使用流式传输,您只能**使用'Stream'类型的单个参数(或“Stream”类型的返回值)。如果您不能像这样设计您的服务,并且必须遵守其他特定要求,那么不幸的是您不能使用流式传输。没有* magic *的方式来完成这项工作。 – 2013-03-05 20:47:41

+0

@marc_s如何处理单个大型字符串参数? [我最近的问题](https://stackoverflow.com/questions/48774474/parameter-size-limit-for-strings#comment84577011_48774474)被标记为重复的,但我可以通过设置适当的参数很容易1.2GB'字节[]'参数方法没有问题,但如果您将参数类型从'byte []'更改为'string',那么它将限制为大约28 MB。我必须有'string'作为参数。 – Franck 2018-02-14 13:17:19

0

您可以使用带有TransferMode流的webHttpBinding和适用于大型文件上传/下载的单个Stream参数或Stream响应,但是您必须通过URL和/或标头发送任何请求元数据,除非您'重新设计你自己的流媒体框架。不过,你必须构建一个自定义的非HTML客户端(比如Silverlight,Flash等),因为浏览器不支持随机访问本地文件,普通的文件上传将是一个表单文章,而不是JSON。

1

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

+1

单独使用MTOM并没有多大帮助 - 您仍然需要将整个消息组装到缓冲区中进行传输。 – 2009-12-20 12:30:19