我正在调查使用WCF的项目,这将需要人们上传大文件(64MB-1GB)到我的服务器的能力。我将如何处理这与WCF,可能有能力恢复上传。如何通过WCF处理大文件上传?
为了处理更大的客户群,我想通过WCF测试JSON。这将如何影响文件上传?它可以从JSON完成,还是需要切换到REST以获取上传部分?
我正在调查使用WCF的项目,这将需要人们上传大文件(64MB-1GB)到我的服务器的能力。我将如何处理这与WCF,可能有能力恢复上传。如何通过WCF处理大文件上传?
为了处理更大的客户群,我想通过WCF测试JSON。这将如何影响文件上传?它可以从JSON完成,还是需要切换到REST以获取上传部分?
如果你想上传大文件,你一定要看看WCF Streaming Mode。
基本上,您可以更改绑定的传输模式;默认情况下它是缓冲的,即整个消息需要在发送方上进行缓冲,序列化,然后作为一个整体进行传输。
借助Streaming,您可以定义单向流式传输(仅用于上传,仅用于下载)或双向流式传输。这是通过将您的绑定的transferMode设置为StreamedRequest
,StreamedResponse
或仅仅是普通的Streamed
来完成的。
<bindings>
<basicHttpBinding>
<binding name="HttpStreaming"
maxReceivedMessageSize="2000000"
transferMode="StreamedRequest"/>
</basicHttpBinding>
</bindings>
然后,你需要具有任一接收Stream
类型(上传)的参数,或返回Stream
类型(下载)的值的服务合同。
[ServiceContract]
public interface IFileUpload
{
[OperationContract]
bool UploadFile(Stream stream);
}
应该这样做!
您可以使用带有TransferMode流的webHttpBinding和适用于大型文件上传/下载的单个Stream参数或Stream响应,但是您必须通过URL和/或标头发送任何请求元数据,除非您'重新设计你自己的流媒体框架。不过,你必须构建一个自定义的非HTML客户端(比如Silverlight,Flash等),因为浏览器不支持随机访问本地文件,普通的文件上传将是一个表单文章,而不是JSON。
如果您的请求/响应必须遵循特定的模式,该怎么办?也就是说,如果请求必须是特定的对象,并且您的wsdl需要反映该请求?你将如何用流实施? – Jeremy 2013-03-05 20:35:52
@Jeremy:正如我的回应所说:如果您想使用流式传输,您只能**使用'Stream'类型的单个参数(或“Stream”类型的返回值)。如果您不能像这样设计您的服务,并且必须遵守其他特定要求,那么不幸的是您不能使用流式传输。没有* magic *的方式来完成这项工作。 – 2013-03-05 20:47:41
@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