Có điều gì cần lưu ý khi chạy quy trình của bạn hoặc thực thi dưới dạng dịch vụ. Những điều như ghi nhật ký im lặng.Các tình huống báo cáo lỗi nghiêm trọng? v.v. Làm thế nào để bạn xử lý nó ?Các phương pháp hay nhất khi chạy quy trình dưới dạng dịch vụ cửa sổ là gì?
Trả lời
Để 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.
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
+1 Cũng tương tự như EE nơi bạn có thể có "Giải pháp được hỗ trợ". – James
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
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.
Đả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ư.
- Đả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 'Thiên Chúa của tôi điều này giúp tôi mỗi lần.' – kenny
Biến STOP là gì? Nghe có vẻ giống như điều tôi nên biết. – BanksySan
@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
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.
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.
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 –
- 1. Chạy tập lệnh python dưới dạng dịch vụ cửa sổ
- 2. Chương trình Java dưới dạng dịch vụ cửa sổ
- 3. Chạy quy trình Java dưới dạng Dịch vụ trong Linux
- 4. Chạy lệnh dưới dạng quy trình/dịch vụ nền
- 5. Các dịch vụ Windows có dạng cửa sổ trong cùng một quy trình
- 6. Các phương pháp hay nhất để theo dõi cảnh báo/lỗi trong các quy trình chạy dài là gì?
- 7. Ưu điểm và nhược điểm khi chạy Quartz.NET được nhúng hoặc dưới dạng dịch vụ cửa sổ
- 8. Nhà môi giới dịch vụ SQL và Dịch vụ Windows .NET - Các phương pháp hay nhất?
- 9. Không thể đính kèm cửa sổ Quy trình dịch vụ
- 10. Chỉ mục MySQL - các phương pháp hay nhất là gì?
- 11. Cài đặt chương trình java dưới dạng dịch vụ cửa sổ: Thay thế cho JavaService?
- 12. Các phương pháp hay nhất để gửi phản hồi lỗi trong các dịch vụ web JSON là gì?
- 13. Phương pháp tốt nhất để chạy ứng dụng Java dưới dạng * nix Daemon hoặc Dịch vụ Windows?
- 14. Làm cách nào để chạy tệp java .jar dưới dạng dịch vụ cửa sổ trên máy chủ Windows 2008?
- 15. Dừng các cửa sổ hiển thị dưới dạng 'tác vụ' từ trình quản lý tác vụ WPF C#
- 16. Các phương pháp hay nhất để xử lý lỗi trong dịch vụ web
- 17. Log4Net với WCF đang chạy dưới dạng dịch vụ
- 18. Các phương pháp hay nhất cho quy trình làm việc của ứng dụng web?
- 19. MVVM-light + RIA Các phương pháp hay nhất về Dịch vụ RIA
- 20. Dừng dịch vụ cửa sổ nhiều luồng
- 21. Window.open dưới dạng cửa sổ bật lên phương thức?
- 22. Các phương pháp hay nhất cho pubnub trên android
- 23. Các phương pháp hay nhất để ngăn chặn tấn công từ chối dịch vụ ở Django
- 24. Các phương pháp hay nhất trong việc xây dựng các ứng dụng nhiều người thuê nhà là gì?
- 25. Các phương pháp hay nhất cho trang gốc của API REST là gì?
- 26. Phương pháp hay nhất với truy vấn phương tiện trong CSS3 là gì?
- 27. Python dưới dạng FastCGI dưới cửa sổ và apache
- 28. Các phương pháp hay nhất để phiên bản dịch vụ của bạn với WCF?
- 29. Cách tốt nhất để sử dụng các tiện ích linux dưới cửa sổ là gì?
- 30. Các phương pháp hay nhất về Javascript
Microsoft có bài viết KB cho https://support.microsoft.com/en-us/kb/821794 này. – kiran