【问题标题】:Time taken to throw EndPointNotFoundException抛出 EndPointNotFoundException 所花费的时间
【发布时间】:2012-04-04 17:45:24
【问题描述】:

我从代码调用服务,如果服务因任何原因停止,它会给我 EndPointNotFound 异常。

 <binding name="NormalMode" transferMode="Buffered" receiveTimeout="24.20:31:23.6470000">
      <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647"/>
      <security mode="None" />
    </binding>

我没有设置 openTimeOut,所以它会考虑默认的 1 分钟超时。

我是这样调用服务的,

 private void MyServiceCall(Action serviceCall)
    {
        try
        {
            if (serviceCall != null)
            {
                serviceCall();
            }
        }
        catch (EndpointNotFoundException endpointNotFoundException)
        {
                            throw new EndpointNotFoundException(endpointNotFoundException.Message, endpointNotFoundException);
        }

我的问题是,如果服务停止,那么抛出 EndPointNotFoundException 需要 1 分钟吗??

编辑::

在这种情况下,我知道服务已停止。我通过停止服务来测试它。问题是我们已经开发了断开连接的 senario,如果服务停止,它将返回默认数据,但这需要时间,所以我正在调查是否是 openTimeOut 负责它。

【问题讨论】:

  • 请问你为什么在一个捕获EndpointNotFoundException的catch块中抛出一个EndpointNotFoundException
  • @Thorsten Dittmar:非常好的问题。我希望有人至少在重新抛出异常之前记录它。
  • 如果需要重新抛出异常,throw 就足够了。
  • 我在抛出异常之前记录了它,我已经删除了那些行。如果我只写 throw 会有什么不同吗?我的意思是客户端的任何堆栈差异
  • Throw 将抛出确切的异常,确切的堆栈跟踪,就像它在原始抛出时一样。如果你不想这样,抛出你在 catch 中遇到的异常:catch(Exception ex) { throw ex; }

标签: c# wcf


【解决方案1】:

客户端连接失败的原因有很多,例如网络问题,服务器应用程序池停止/锁定,服务器线程池耗尽等。

这些不一定会引发 EndpointNotFoundException - 例如如果应用程序池停止,则 503 错误将在客户端上显示为 ServiceTooBusyException。在这种情况下,错误将“立即”发生,并且不会“等待”配置的超时持续时间,以便服务在服务器上“复活”自身。 (即openTimeout指定允许的最长时间)

您最好捕获一个基本异常并从那里开始工作,例如 System.ServiceModel.CommunicationException 甚至只是一个System.Exception

在不相关的一点上,请注意,随意“最大化”所有 WCF 配置设置是不明智的 - 请参阅 C# WCF - Client/Server - System.OutOfMemory Exception

【讨论】:

  • 感谢您的回复。我实际上已经这样做了,但在这种情况下,我知道服务已停止。我通过停止服务来测试它。问题是我们已经开发了断开连接的 senario,如果服务停止,它将返回默认数据,但这需要时间,所以我正在调查是否是 openTimeOut 负责它。
【解决方案2】:

一个 TimeSpan 值,指定为完成 打开操作提供的时间间隔。该值应大于或等于零。默认为 00:01:00。

所以我的理解是,已经打开的操作应该在一分钟内完成。任何意见 ??因为我正在测试它,抛出 EndPointNotFoundException 只需要 5 秒

【讨论】:

  • 这是一个最大阈值。如果底层 TCP/IP 连接在较短的时间范围内失败(例如 HTTP 404、5xx 等),那么异常将在比时间跨度更短的时间内抛出。但是,如果服务器距离很远,并且您有每秒 10 位的网络连接,则可以保证连接不会超过您指定的时间。
猜你喜欢
  • 2014-06-19
  • 1970-01-01
  • 2013-03-11
  • 1970-01-01
  • 2016-12-12
  • 1970-01-01
  • 2011-08-21
  • 2020-06-30
  • 1970-01-01
相关资源
最近更新 更多