客户端采用纯Html方式提交form
服务器宿主
<service name="Touch_Dinner.Service.FileService" behaviorConfiguration="BasicBehavior" > <endpoint address="" binding="webHttpBinding" bindingConfiguration="webStream" behaviorConfiguration="AjaxBehavior" contract="Touch_Dinner.Contract.IFileService" /> </service>
尝试过下面两种设置还是异常
<webHttpBinding> <binding name="webStream" sendTimeout="00:10:00" transferMode="Streamed" maxReceivedMessageSize="9223372036854775807"> </binding> <binding name="webBinding" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="524288" maxReceivedMessageSize="999999" useDefaultWebProxy="true" allowCookies="false"> <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" /> </binding> </webHttpBinding> <behavior name="Asp.netAjaxBehavior"> <webHttp/> <enableWebScript/> </behavior>
服务
此流不支持超时?
我发的图片文件只有10几k大小。
请问如何解决,似乎无法接收,求大神
应该需要在配置上写一些配置
请问怎么配置?有例子嘛?
HttpRuntimeRequestLength
默认4m吧,我上传10k的小图都不行。。。。。
WCF并不支持Stream对象Length属性的序列化,也就是说,在客户端我们不能使用服务操作返回的Stream对象的Length属性。可使用
public byte[] ReadFully (Stream stream) { // 初始化一个32k的缓存 byte[] buffer = new byte[32768]; using (MemoryStream ms = new MemoryStream()) { //返回结果后会自动回收调用该对象的Dispose方法释放内存 // 不停的读取 while (true) { int read = stream.Read(buffer, 0, buffer.Length); // 直到读取完最后的3M数据就可以返回结果了 if (read <= 0) return ms.ToArray(); ms.Write(buffer, 0, read); } } }
这种方法是可以解决Wcf处理Stream 的length 问题,但同时有可能会引发内存溢出 问题,using (MemoryStream ms = new MemoryStream()),固然能使用using 释放,但文件流很大时还是会在释放前引发内存溢出。
所以推荐使用 byte[]数组,不用传Stream
<readerQuotas maxDepth="64"
maxStringContentLength="2147483647"
maxArrayLength="2147483647"
maxBytesPerRead="2147483647"/>
请问最后是怎么解决的?