我有一个像这样的WCF操作,
public bool SubmitDocument(byte[] document)
所以想法是调用者将序列化文档,并调用上面的操作。然后它被放入我们的数据库。
我试图理解WCF的内部工作原理,所以当有人调用上面的操作时,在调用实际操作之前,所有byte []数据都需要发送到服务器似乎是合乎逻辑的。
有什么方法可以在数据开始上传到服务器时“记录”,如果在某种程度上失败,还会发现错误吗?我遇到的问题是大约4mb的文件部分失败,我的WCF服务甚至没有注册有人试图调用该操作。
我已经像这样增加了上传大小限制
<wsHttpBinding>
<!-- The upload limit should be 5 Mb, rounding up to 6 Mb just to be sure -->
<binding name="CarWebserviceBinding" maxReceivedMessageSize="6291456">
<security mode="None">
</security>
<!-- The upload limit should be 5 Mb, rounding up to 6 Mb just to be sure -->
<readerQuotas maxArrayLength="6291456" />
</binding>
</wsHttpBinding>
整体问题是第三方调用上面的WCF操作(SubmitDocument),如果超过4Mb,文档永远不会结束。
答案 0 :(得分:3)
您超出了WCF邮件的默认缓冲区大小。您可能需要了解TransferMode Streamed。这里有一个问题WCF HttpTransport: streamed vs buffered TransferMode
答案 1 :(得分:2)
我在这里找到了答案,
http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/f6541134-2e08-4eb9-987b-2158fb99b403
因此,我已经正确处理了各种WCF限制,
<wsHttpBinding>
<!-- The upload limit should be 5 Mb, rounding up to 6 Mb just to be sure -->
<binding name="CarWebserviceBinding" maxReceivedMessageSize="6291456">
<security mode="None">
</security>
<!-- The upload limit should be 5 Mb, rounding up to 6 Mb just to be sure -->
<readerQuotas maxArrayLength="6291456" />
</binding>
</wsHttpBinding>
但我没做过的就是这个,
<system.web>
<httpRuntime maxRequestLength="16384" /> <!-- 16MB -->
</system.web>
对于任何进入的http请求,IIS的默认限制大约为4MB。上述设置会覆盖该限制。
另外需要提及的是,我将此添加到我的web.config中以打开跟踪,
<system.diagnostics>
<sources>
<source name="System.ServiceModel" switchValue="Information, ActivityTracing" propagateActivity="true">
<listeners>
<add name="traceListener" type="System.Diagnostics.XmlWriterTraceListener" initializeData="c:\logs\Traces.svclog" />
</listeners>
</source>
</sources>
</system.diagnostics>
并在错误日志中显示错误
CommunicationException - Maximum request length exceeded