2010-09-15 169 views
0

我正在創建一個WCF服務,並且在我的一些集成測試中使用它時會超時。我已經能夠縮小它的範圍,並通過以下代碼進行演示。看起來在創建主機之前創建一個表單會導致問題,但我不知道爲什麼。WCF服務超時

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); 
     } 
    } 
} 
+0

什麼錯誤訊息顯示?如果你根本沒有創建表單,它是否仍然超時? – Bernard 2010-09-15 18:54:33

+0

你的配置文件是什麼樣的?看到這可能也有幫助。 – 2010-09-15 19:01:59

回答

2

表單更改您的服務的行爲 - 您的代理和服務在同一個線程中運行。

在UI線程和非UI線程中託管服務存在差異。當您在非UI線程中託管服務時,服務將創建新線程來處理請求。如果您在UI線程中託管服務(如果您在那裏運行任何WinForm或WPF表單,它就會發生),默認情況下它不會使用新線程。相反,它將處理接收的呼叫作爲標準Windows消息循環的一部分。

添加ServiceBehavior避免這種行爲:

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

這正是問題所在。謝謝! – 2010-09-16 14:29:59