2013-02-24 117 views
1

我想讓我的第一個WCF程序。它應該很簡單,但我無法實現它的工作。C#:WCF客戶端不連接到同一臺機器

步驟我迄今所做的:

  1. 創建C#Windows窗體應用程序
  2. 添加一個按鈕
  3. 增加了一個WCF服務項目。
  4. 更改了代碼根據thisthis頁面教程。

IWCF.cs代碼:

using System; 
...etc 

namespace WCF_Application 
{ 

    [ServiceContract] 
    public interface IWCF 
    { 
     [OperationContract] 
     string DoWork(); 
    } 
} 

WCF.cs代碼:

using System; 
... 

namespace WCF_Application 
{ 

    public class WCF : IWCF 
    { 
     public string DoWork() 
     { 
      return " Hello There! "; 
     } 

    } 
} 

按鈕代碼:

private void btnConnect_Click(object sender, EventArgs e) 
     { 
// Starting the Server 

      ServiceHost svh = new ServiceHost(typeof(WCF)); 
      svh.AddServiceEndpoint(
       typeof(IWCF), 
       new NetTcpBinding(), 
       "net.tcp://localhost:8000"); 
      svh.Open(); 
      MessageBox.Show("Connected"); 

// Connecting Client to the server 
      ChannelFactory<IWCF> scf; 
      scf = new ChannelFactory<IWCF>(
         new NetTcpBinding(), 
         "net.tcp://localhost:8000"); 

      IWCF s = scf.CreateChannel(); 
      string response = s.DoWork(); 
      MessageBox.Show(response); 
      svh.Close(); 
} 

我不明白ŧ他迴應消息。該計劃剛剛凍結。當我跟蹤代碼時,程序卡在strong response = s.DoWork();行。

我也在cmd中檢查了netstat -a。並且似乎8000端口在聆聽模式下打開。所以問題應該在客戶端部分。

操作系統Windows 7/ VS 2010/ C#

+0

嘗試在服務器上放置一個斷點,該呼叫是否實際進入? – 2013-02-24 12:45:01

+0

@ImmortalBlue究竟在哪裏?我不明白你的意思是「在服務器上」。 – xperator 2013-02-24 14:48:21

+0

好吧,您的服務類廣泛地說是在服務器上運行。在C#中,這相當於您的服務類(在您的情況下是WCF類)。在工作返回線上劃一個斷點,看看它是否被調用,返回是否被正確執行,或者如果它沒有得到那麼多。我建議開始一個香草WCF項目,看看如果沒有任何修改工作。 – 2013-02-24 15:24:32

回答

3

您正在運行到死鎖問題,在這裏,因爲你的WCF服務是同一個線程的UI託管。您可以嘗試以下操作在另一個線程上託管服務。

[ServiceBehavior(UseSynchronizationContext = false)] 
public class WCF : IWCF 
{ 
    public string DoWork() 
    { 
     return " Hello There! "; 
    } 
} 

這裏是關於WPF threading modelUseSynchronizationContext一些背景。或者,您可以將客戶端調用連接到您的服務,但也可能會有其他UI更新後果。

+0

哦,你是對的,我沒有關注線程部分。非常感謝! :) – xperator 2013-02-24 18:18:11