2010-02-17 26 views

Trả lời

19

Để báo cáo lỗi nghiêm trọng, bạn bị ràng buộc khi sử dụng cài đặt Dịch vụ chuẩn (trong thuộc tính của dịch vụ được cài đặt) hoặc tự làm một việc gì đó. Điều này có thể đơn giản là tệp nhật ký ghi nhật ký lỗi không mong muốn (bằng cách sử dụng AppDomain.UnhandledException để bắt và ghi nhật ký), sử dụng nhật ký sự kiện Windows để ghi thông tin tương tự hoặc có quá trình khác xem dịch vụ cho lỗi (ví dụ: dừng dịch vụ) và cảnh báo ai đó.

Microsoft có một bài viết có tựa đề "Introduction to Windows Service Applications", đây là phần giới thiệu chung về cách tạo các dịch vụ trong .Net.

Một số điều khác về việc phát triển các dịch vụ Windows từ kinh nghiệm của tôi:

  • dịch vụ Một Windows được phép khoảng 30 giây để khởi động. Sau đó, Windows sẽ báo cáo nó là không bắt đầu chính xác. Điều này có nghĩa là bạn cần đảm bảo rằng phương thức OnStart của dịch vụ khởi động một chuỗi mới để chạy dịch vụ và sau đó trả về.
  • Đừng mong đợi bất kỳ tương tác người dùng nào (ví dụ: hộp thư, xác nhận) vì dịch vụ chạy "không đầu" (nghĩa là không có giao diện người dùng), vì vậy bạn không thể mong đợi người dùng tương tác với nó.
  • Kiểm tra tài khoản mà dịch vụ sẽ chạy để đảm bảo rằng bạn không chạy nó với tư cách người dùng có đặc quyền bảo mật cao không cần thiết.
  • Sử dụng rộng rãi ghi nhật ký (ví dụ log4net) để bạn có thể xem dịch vụ đang thực hiện trong thời gian chạy, cũng như có thể chẩn đoán bất kỳ lỗi nào (bằng cách ghi nhật ký ngăn xếp).
  • Đảm bảo bạn sử dụng đúng phiên bản InstallUtil (ví dụ 32 hoặc 64 bit) để cài đặt dịch vụ. Thậm chí tốt hơn, hãy để bản thân dịch vụ tự cài đặt bằng cách sử dụng ManagedInstallerClass.InstallHelper.
+2

Vì vậy, thực sự cần một chức năng "kết hợp câu trả lời" để cả hai chúng ta có thể đúng :). Đặc biệt với những câu hỏi kiểu "danh sách" chủ quan này. – TheSoftwareJedi

+0

+1 Cũng tương tự như EE nơi bạn có thể có "Giải pháp được hỗ trợ". – James

+1

Trích dẫn từ trang MSDN _This API hỗ trợ cơ sở hạ tầng .NET Framework và không có ý định được sử dụng trực tiếp từ mã của bạn._ Vì vậy, tôi có nên thực sự có dịch vụ tự cài đặt không? – BanksySan

3

Không hiển thị bất kỳ hộp/hộp thoại tin nhắn nào.

Lưu ý rằng ứng dụng của bạn thường sẽ không chạy dưới cùng một tài khoản với tư cách người dùng đã đăng nhập. Vì vậy, nếu người dùng có thể truy cập một số tập tin/thư mục, điều này không có nghĩa là dịch vụ có thể làm tốt.

3

Đảm bảo rằng bạn có một số hình thức hệ thống cảnh báo để thông báo cho bạn nếu dịch vụ rơi xuống, ví dụ: gửi email cho chính bạn hoặc một số hộp thư.

14
  • Đảm bảo sử dụng API truy tìm/ghi nhật ký để có thông tin chẩn đoán. Eventlog, tệp nhật ký, cơ sở dữ liệu, bất cứ điều gì ... Chỉ cần có thông tin khắc phục sự cố ở đâu đó.
  • Dấu vết/Đăng nhập sớm và thường xuyên. Không có gì là bực bội hơn sau đó phải thực hiện một sự thay đổi mã mà chỉ là thêm truy tìm chẩn đoán.
  • Nhận thức được sự rò rỉ bộ nhớ. Khi viết một ứng dụng sẽ được khởi động lại hàng ngày hoặc chạy như một nhiệm vụ theo lịch trình, đôi khi chúng ta có một chút lười biếng. Hãy nhớ rằng dịch vụ này cần phải tự dọn dẹp sau khi hoàn toàn. Sử dụng đúng mệnh đề sử dụng với tất cả các IDisposables.
  • Đừng quên biến động từ khóa trên biến STOP của bạn! Thiên Chúa của tôi điều này giúp tôi mỗi lần.
+1

+1 'Thiên Chúa của tôi điều này giúp tôi mỗi lần.' – kenny

+1

Biến STOP là gì? Nghe có vẻ giống như điều tôi nên biết. – BanksySan

+1

@BanksySan thường mã cửa sổ dịch vụ chạy trong một vòng lặp kiểm tra một biến thể hiện boolean cho một tín hiệu dừng. while (! stop) {// service code} ... Biến dừng này phải được đánh dấu là dễ bay hơi. – TheSoftwareJedi

1

Nếu có ý nghĩa, đừng quên triển khai sự kiện Tạm dừng. Xử lý tất cả các ngoại lệ để nó không thành công khi không thành công.

3

Tôi có một cái tốt, thêm mã sau vào phương pháp OnStart của bạn hoặc thậm chí tốt hơn trước khi nó trong phương pháp chính của bạn.

#if DEBUG 
    //LogMessage("Service starting"); 
    #warning The service has been set to break on debug. Only used for debugging. 

    //LogMessage("DEBUG MODE - If the service crashed after this then your problem is that you're running in DEBUG mode without a Visual Studio installed."); 
    if (Debugger.IsAttached == false) Debugger.Launch(); 
#endif 

Về cơ bản các bộ phận quan trọng nếu Debugger.Launch() đó sẽ bật mở một cửa sổ khi bạn bắt đầu dịch vụ và yêu cầu bạn cho dù bạn muốn gỡ lỗi dịch vụ và mà Visual Studio. Nó làm cho làm việc với các dịch vụ tuyệt vời và dễ dàng. Tôi đặt #warning chỉ để nó xuất hiện trong danh sách cảnh báo để nhắc tôi ở đó, mặc dù #if DEBUG nên ngăn chặn hầu hết các vấn đề.

Chỉ cần nhớ không triển khai với mã này đang chạy (tức là không phát hành mã gỡ lỗi) vì nó bị lỗi nếu không có Visual Studio được cài đặt trên máy.

+0

Ngoài ra - trong khi làm việc với các dịch vụ rất nhiều, tôi đã tạo ra một công cụ giúp tôi vô cùng và tăng tốc bật và tắt chúng - https://bitbucket.org/mmihajlovic/servicemanager –

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