如何判断何时调用WCF操作

时间:2011-03-16 00:01:51

标签: c# .net wcf

我有一个像这样的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,文档永远不会结束。

2 个答案:

答案 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