我是.NET,C#和WCF的新手,我正在尝试创建一个服务,它将公开允许上传和下载大量对象(对象数组)的方法。我在WCF中看到了很多关于大文件传输的帖子,但我似乎无法找到任何专注于上传和下载大量可序列化对象的内容。
我已经能够" hack up"允许字节和超时限制等的web.config文件,但我想知道是否有更好的方法来配置WCF
以获得更好的速度和内存使用以允许这种传输。因为我已经根据我的测试结果配置了web.settings(如果超出超时/字节限制,用一些疯狂的大数字等增加限制)我怀疑我的配置是否有意义。
其次,我已经看到了一些实现选项,比如绑定TransferMode = Streaming or MTOM
,但我不知道它们是否会适用于我的场景。有人可以指出我正确的方向吗?
抱歉,我可能没有很好地构建我的问题,但我们将非常感谢您的想法。
以下是我的web.config设置:
<system.web>
<httpRuntime maxRequestLength="409600000" executionTimeout="360000"/>
<compilation debug="true" targetFramework="4.0" />
</system.web>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHTTP" closeTimeout="00:01:00" receiveTimeout="01:00:00"
sendTimeout="01:00:00" maxBufferSize="655360000" maxReceivedMessageSize="655360000"
messageEncoding="Text" />
</basicHttpBinding>
</bindings>
<services>
<service behaviorConfiguration="ServiceBehavior" name="WebService.WebService">
<endpoint address="" behaviorConfiguration="BasicEndPoint" binding="basicHttpBinding"
bindingConfiguration="BasicHTTP" name="BasicHTTP" contract="WebService.IWebService" />
</service>
</services>
<behaviors>
<endpointBehaviors>
<behavior name="BasicEndPoint">
<dataContractSerializer maxItemsInObjectGraph="65536000" />
</behavior>
</endpointBehaviors>
<serviceBehaviors>
<behavior name="ServiceBehavior">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>
<system.webServer>
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="204800000" />
</requestFiltering>
</security>
<modules runAllManagedModulesForAllRequests="true" />
</system.webServer>
答案 0 :(得分:1)
我建议仅将流模式用于视频/音频流等类似的任务,当你真正拥有主机上的流时,你真的需要在客户端接收流。 对于任何其他任务,我会使用缓冲模式,因为它更容易使用,因为许多有用的wcf功能依赖于缓冲。使用具有启用的SOAP消息级安全性的流式传输(例如),可能会消除流式传输模式的速度优势(如果您曾经有过)。
在您的情况下,我建议您执行一些解决方法。请检查以下步骤:
有关架构的一些提示
您可以进一步实施两步架构。第一步:远程客户端定义请求的参数(所有这些参数,包括压缩模式,分裂模式和所有其他)。第二步:接收数据。令牌怎么样?方法应如下所示:
string GetTokenForDataRequest(string compressionMode, int maxChunkSize); //additional parameters like dates range, account number an other are defined in this method only
int GetChunkCount(string token);
byte[] GetDataChunkAtIndex(string token, int index);
此处 compressionMode 可以是“None”,“BZip2”或“GZip”;如果 maxChunkSize 为0则禁用拆分(所有数据将在一个块中发送),否则将数据拆分为大小等于 maxChunkSize 的块(最后一个将小于其他)。所以近似情况如下:
不要只看可能的解决方案。只需谷歌一点点,你就会找到自己解决问题的方法!
答案 1 :(得分:0)
您可以使用streaming邮件传输,但它有一些限制 如果流式传输不适合您,您可以实现数据分页(或尝试现有的实现,如WCF Data Services)。