2010-01-13 57 views
1

我有一個WCF主機,用於監聽主題並處理傳入的消息。代碼看看這個:WCF不會收到消息 - 如何調試WCF服務?

using (ServiceHost host = new ServiceHost(MessagingServiceType)) 
{ 
       host.Open(); 
} 

和MessagingServiceType看起來像這樣:

[ServiceBehavior(AddressFilterMode = AddressFilterMode.Any)] 
    public class MessagingServiceType : IMessagingService 
    { 
     /// <summary> 
     /// service instance 
     /// </summary> 
     private readonly MessagingService service; 

     /// <summary> 
     /// Initializes a new instance of the <see cref="MessagingServiceType"/> class. 
     /// </summary> 
     public MessagingServiceType() 
     { 
      // creating new messaging service 
      service = new Singleton<MessagingService>(); 
     } 

     /// <summary> 
     /// Sends the message. 
     /// </summary> 
     /// <param name="messageContent">Content of the message.</param> 
     public void SendMessage(string messageContent) 
     { 
      Message msg = Message.CreateMessage(MessageVersion.Default, string.Empty, messageContent); 

      service.MessageReceived(msg); 
     } 
    } 

的問題是,當我運行它在一個單獨的測試程序,一切工作正常和所有的接待服務所有消息。但是,當我採用完全相同的代碼並將其放入我的REAL應用程序中時,不會收到任何消息。

我的問題很簡單:我怎樣才能「調試」這個服務,看看它有什麼問題,爲什麼消息沒有被處理?無論如何比較兩者之間?

感謝

+2

我猜''使用'塊中有更多的代碼,因爲否則主機將被丟棄。 – CSharpAtl 2010-01-13 16:01:43

回答

4

確保自己的服務將不會收到任何事情....只是看看你的代碼:

using (ServiceHost host = new ServiceHost(MessagingServiceType)) 
{ 
       host.Open(); 
} 

當你到達到底會發生什麼「}」?? 「使用」條款中的對象 - 您的ServiceHost - 將被釋放/處置! ==>你知道它之前,你的服務將再次走了.....

你需要做的是這樣的:

ServiceHost host = new ServiceHost(MessagingServiceType); 
host.Open(); 

Console.ReadLine(); // wait for a ENTER press 
host.Close(); 

不需要大的調試........:-)

+0

+1,omg,nice catch =) – 2010-01-13 16:13:49

+1

是的,這是我的意見.....假設有更多的代碼,他們留在使用塊。 – CSharpAtl 2010-01-13 17:10:29

+0

謝謝,清楚... – 2010-01-13 19:11:30

1

有幾個選項:

  • 您可以將您的Visual Studio調試器爲您的服務主機
  • 您可以創建一些message inspector檢查接收到的消息
  • 可以使用包嗅探器,但這似乎是一個矯枉過正。

只要確保您的服務已啓動並正常運行(不會從您的主機中拋出錯誤),並且您從開發.config文件複製了所有相關設置信息。

1

Visual Studio提供了附加到遠程進程以進行調試的功能。它將要求您在遠程計算機上運行Visual Studio遠程調試監視器。

從視覺工作室,你可以去Debug/Attach To Process。在出現的對話框中,您會看到一個Qualifier標籤,允許您輸入遠程服務器名稱。一旦你把它放入,你可以附加到你的WCF服務的進程。如果您的服務是通過IIS託管的,則可能需要附加到w3wp.exe進程。

這將允許您在代碼中的服務方法中設置斷點,並且當遠程服務執行這些方法時,斷點將被命中。重要的是,您的代碼與遠程服務器上的代碼完全同步,否則,當您逐步通過調試器時,您的線路將會關閉。

下面是也有一些技巧的鏈接: http://geekswithblogs.net/TimH/archive/2006/08/08/87355.aspx