【问题标题】:How can I keep WCF from timing out?如何防止 WCF 超时?
【发布时间】:2015-09-11 19:18:51
【问题描述】:

我有一个非常简单的 WCF 服务:

[ServiceContract]
public interface IEngine
{
    #region Test code
    // test - xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    [OperationContract]
    string Test();
     }

实现如下:

public partial class Engine : IEngine
{
    private static int nTestCount = 0;
    string IEngine.Test()
    {
        try
        {
            nTestCount++;
        }
        catch (Exception)
        {
        }

        return "Service OK " + nTestCount.ToString();
    }
     }

当我在大约 10 秒内调用测试服务方法 10 次时...我收到此错误:

请求通道在 00:01:00 后等待回复时超时。增加传递给 Request 调用的超时值或增加 Binding 上的 SendTimeout 值。分配给此操作的时间可能是较长超时的一部分。

(我试图放入我的 web.config 文件,但它没有显示在这里) (对发布内容的帮助将不胜感激)

更新 1:

这是调用服务的客户端代码:

    private void btn_Test_Click(object sender, EventArgs e)
    {
        ServiceReference1.EngineClient eng = new EngineClient();
        textBox1.Text = eng.Test();
    }

【问题讨论】:

  • 如果你调用一次它会正常工作还是你也会得到那个错误?另外,有两件事 1) 为什么 nTestCount++ 在 try/catch 中? 2)++ 运算符不是线程安全的,不能对静态变量执行此操作。您必须改用Interlocked.Increment(ref nTestCount); 或启用某种锁定。请使用调用代码更新您的问题,问题可能出在代码的那一侧,即您如何进行 10 次调用。
  • 您是每次通话都使用相同的连接还是创建一个新连接?如果您正在创建一个新连接,您是否要关闭以前的连接?
  • Scott - 我按前 9 次效果很好,但按钮调用客户端代码......但第 10 次失败(大约在几秒钟内)测试代码只是为了提供帮助我弄清楚该服务“停止工作”需要多少次......一旦我弄清楚......整数将与try catch一起被删除。 :-)
  • Mumbo - 我每次都在创建一个新连接...查看更新的问题

标签: c# wcf service


【解决方案1】:

当你完成连接时,你并没有关闭它们,这会导致服务器绑定连接,直到垃圾收集器收集你的对象。对于 .net 3.5 及更早版本 (it was raised to 100 * ProcessorCount in .NET 4),服务器可以处理的默认最大打开会话数为 10。

处理掉引擎,它应该可以正常工作。

private void btn_Test_Click(object sender, EventArgs e)
{
    using(ServiceReference1.EngineClient eng = new EngineClient())
    {
        textBox1.Text = eng.Test();
    }
}

【讨论】:

    【解决方案2】:

    您不会在每次使用后关闭客户端连接,这会在一段时间后导致服务用完可用连接。一旦服务达到其最大打开连接数,新连接将超时等待连接清除。

    您需要在完成连接后通过调用它们的 Dispose() 或使用块包装它们来关闭它们

    private void btn_Test_Click(object sender, EventArgs e)
    {
        using (ServiceReference1.EngineClient eng = new EngineClient())
        {
            textBox1.Text = eng.Test();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-03
      • 1970-01-01
      • 2017-04-08
      • 1970-01-01
      • 2011-01-04
      • 2012-10-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多