WCF服务超时

时间:2010-09-15 18:46:22

标签: wcf

我正在创建一个WCF服务,并且在我的某些集成测试中使用它时会超时。我已经能够缩小它,并通过以下代码进行演示。看来在创建主机之前创建一个Form会导致问题,但我不确定原因。

class Program
{
    [ServiceContract]
    public interface IMyContract
    {
        [OperationContract]
        void Ping();
    }
    public class MyContract : IMyContract
    {
        public void Ping()
        {
            Console.WriteLine("Ping");
        }
    }
    public class MyContractProxy : ClientBase<IMyContract>, IMyContract
    {
        public MyContractProxy(int port)
            : base(new NetTcpBinding { SendTimeout = TimeSpan.FromSeconds(5) }, new EndpointAddress(string.Format("net.tcp://localhost:{0}", port)))
        {
        }

        public void Ping()
        {
            Channel.Ping();
        }
    }

    static void Main(string[] args)
    {
        try
        {
            new Form();
            var host = new ServiceHost(typeof(MyContract));
            host.AddServiceEndpoint(typeof(IMyContract), new NetTcpBinding(), "net.tcp://localhost:12345");
            host.Open();

            var proxy = new MyContractProxy(12345);
            proxy.Open();
            proxy.Ping();
        }
        catch (Exception e)
        {
            Console.Error.WriteLine(e);
        }
    }
}

1 个答案:

答案 0 :(得分:2)

表单更改服务的行为 - 您的代理和服务在同一个线程中运行。

UI线程和非UI线程中的托管服务存在差异。当您在非UI线程中托管服务时,服务会创建用于处理请求的新线程。如果您在UI线程中托管服务(如果您在那里运行任何WinForm或WPF表单会发生这种情况),默认情况下它不会使用新线程。相反,它会将调用作为标准Windows消息循环的一部分进行处理。

添加ServiceBehavior以避免此行为:

[ServiceBehavior(UseSynchronizationContext=false)]
public class MyContract : IMyContract
{ ... }