2012-07-13 34 views
5

Tôi có một dịch vụ WCF tổ chức trong một ứng dụng consol (mà cũng đóng vai trò như bộ cài đặt Windows Service), lời cầu xin xem chi tiết ở đây: http://msdn.microsoft.com/en-us/library/ms733069.aspxChạy ứng dụng consol ở chế độ gỡ lỗi với tự WCF?

Đây là cách lớp trong ứng dụng consol trông giống như:

public class MyAppWindowsService : ServiceBase 
    { 
     public ServiceHost _MyAppClientServiceHost = null; 
     public ServiceHost _MyAppIntegrationServiceHost = null; 
     public ServiceHost _MyAppserviceHost = null; 

     public MyAppWindowsService() 
     { 
      // Name the Windows Service 
      ServiceName = "MyApp Service"; 
     } 

     public static void Main() 
     { 
      ServiceBase.Run(new MyAppWindowsService()); 
     } 

     private void StopService(ServiceHost serviceHost) 
     { 
      if (serviceHost != null) 
      { 
        serviceHost.Close(); 
        serviceHost = null; 
      } 
     } 
     private ServiceHost StartService(Type serviceType) 
     { 
      ServiceHost serviceHost = null; 

      // Create a ServiceHost for the CalculatorService type and 
      // provide the base address. 
      serviceHost = new ServiceHost(serviceType); 

      // Open the ServiceHostBase to create listeners and start 
      // listening for messages. 
      serviceHost.Open(); 

      return serviceHost; 
     } 
     private void StartServices() 
     { 
      StopService(_MyAppClientServiceHost); 
      StopService(_MyAppIntegrationServiceHost); 
      StopService(_MyAppServiceHost); 

      _MyAppClientServiceHost = StartService(typeof(MyApp.ServiceImplementation.MyAppClientService)); 
      _MyAppIntegrationServiceHost = StartService(typeof(MyApp.ServiceImplementation.MyAppIntegration)); 
      _MyAppServiceHost = StartService(typeof(MyApp.ServiceImplementation.HL7Service)); 
     } 
     private void StopServices() 
     { 
      StopService(_MyAppClientServiceHost); 
      StopService(_MyAppIntegrationServiceHost); 
      StopService(_MyAppHl7ServiceHost); 
     } 

     // Start the Windows service. 
     protected override void OnStart(string[] args) 
     { 
      StartServices(); 
     } 

     protected override void OnStop() 
     { 
      StopServices(); 
     } 

    } 

Điều này được thực hiện để chạy trong một Dịch vụ Windows, làm thế nào để tôi thực hiện vì vậy tôi có thể chạy điều này như là một selfhost thông thường trong chế độ gỡ lỗi (trong quá trình phát triển)? hoặc tôi có thực sự phải bắt đầu một dự án đặc biệt để có thể gỡ lỗi servuce này trong thời gian chạy không?

Edit:

tôi quyết định sử dụng các dự án cửa sổ dịch vụ hiện có nhưng thay đổi chính để một cái gì đó như thế này:

public static void Main() 
     { 
      if (Debugger.IsAttached) 
      { 
       Console.WriteLine("--- MyApp Services ---"); 
       Console.WriteLine("Starting services..."); 
       Instance.StartServices(); 
       Console.WriteLine("--Finished--"); 
       Console.WriteLine("Press any key to exit"); 
       Console.ReadKey(); 
       Instance.StopServices(); 
      } 
      else 
       ServiceBase.Run(new MyAppWindowsService()); 
     } 

Trả lời

6

Đây là những gì tôi làm

Dung dịch A

  • Cài đặt một dịch vụ Windows sử dụng InstallUtil từ gỡ lỗi của tôi \ bin thư mục
  • Dừng và bắt đầu sử dụng dịch vụ sc start hay sc stop
  • Khi dịch vụ bắt đầu làm Debug> Đính kèm để trình ... và đính kèm VS với dịch vụ

giải pháp B

có một cuộc gọi Debugger.Break trên dòng đầu tiên của phương thức OnStart.

Solution C

Thêm một temp ứng dụng giao diện điều khiển riêng biệt mà không được công việc tương tự như dịch vụ của bạn.

+0

Khi dịch vụ đang chạy trong II7 tôi có thể chỉ ra rằng máy chủ lưu trữ trang web nên được bắt đầu khi gỡ lỗi và nó được chạy từ máy chủ cục bộ. Đây là một giải pháp tuyệt vời. Nhưng bây giờ, nói rằng tôi đã có dịch vụ WCF của tôi cài đặt như một dịch vụ windows và sau đó bắt đầu ứng dụng consol của tôi để gỡ lỗi, ứng dụng consol này sẽ cố gắng để bắt đầu một dịch vụ WCF trên cùng một kênh đã được sử dụng bởi các dịch vụ Windows? Điều này có nghĩa là tôi phải dừng Windows Service trước khi gỡ lỗi ứng dụng consol của tôi (selfhost)? Nó sẽ là tuyệt vời nếu tôi chỉ có thể nhấn gỡ lỗi trong studio trực quan và không có gì nhiều hơn nữa. – Banshee

+0

@SnowJim Tôi thấy bạn quan điểm và tôi hoàn toàn đồng ý rằng đó là một nỗi đau. Nhưng cho đến nay đây là những gì tôi đã đưa ra. Tôi không biết về bất kỳ giải pháp đơn giản nào. Tôi sẽ làm việc với tùy chọn C (máy khách và máy chủ là hai ứng dụng giao diện điều khiển và bạn có thể cấu hình để bắt đầu cả hai trên F5). Khi bạn không cần phải gỡ lỗi nhiều, tôi sẽ chuyển sang tùy chọn A hoặc B. – oleksii

+0

Cảm ơn! Giải pháp của tôi là sử dụng dự án hiện tại nhưng thay vì ServiceBase.Run (mới (MyAppWindowsService() trong chính tôi đã thêm một kiểm tra cho Dubugger.IsAttached và nếu tự khởi động dịch vụ và cũng hiển thị một số thông tin trong consol. – Banshee

Các vấn đề liên quan