【问题标题】:How can I tell when a WCF operation is being called如何判断何时调用 WCF 操作
【发布时间】:2011-03-16 00:01:51
【问题描述】:

我有一个像这样的 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,则永远无法到达我们的末尾。

【问题讨论】:

  • 是的。打开跟踪。
  • 顺便说一句,WCF 没有网络方法。它有操作。这是行业标准术语。
  • 我在下面的回答也提到了我是如何开启追踪功能的。

标签: c# .net wcf


【解决方案1】:

您超出了 WCF 消息的默认缓冲区大小。您可能需要了解 TransferMode Streamed。这里有个问题WCF HttpTransport: streamed vs buffered TransferMode

【讨论】:

  • 我增加了限制,但我可能做错了。我已经更新了我的问题。
  • peter 抱歉,我对 wsHttpBinding 一点也不熟悉。看起来启用跟踪可能是您最好的下一步。
  • 你的意思是超过缓冲区大小会导致401错误吗?
  • @John 那将是一个有趣的效果嗯!不,当我最初回答这个问题时,OP 没有包含有关 401 消息的详细信息。
【解决方案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

【讨论】:

  • 你是说当你添加maxRequestLength后,就不再出现401错误,当你再次取出时,又出现401错误?
  • 是的。 401 的事情很难评论,因为这些错误日志来自使用我们 WCF 服务的不同公司。 IE。我看不到他们的代码,因此理解为什么它会这样失败。
  • 我可以肯定地说,当一个人将大小为 4086kb 的文档上传到网站(术语称为我们的 WCF 服务)时,如果没有设置,它永远不会出现在我们的末尾,并且它出现在我们最后的设置不用担心。
  • 我相信你所说的设置使它起作用;但你的问题说问题是“401”,这个设置根本无济于事。
  • 伙计,我已经删除了问题的 401 部分。这并不相关。一家单独的公司告诉我 401 错误,所以它们可能是别的东西。我很难从第三方那里获得准确的信息,我看不到他们的代码,只能偶尔使用 Skype 聊天与他们交谈。我最后的跟踪记录告诉我,问题肯定是“超出了最大请求长度”。
猜你喜欢
  • 2011-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-15
  • 2016-07-06
  • 1970-01-01
相关资源
最近更新 更多