การใช้ Windows Services ในทางปฏิบัติมีอะไรบ้าง [ปิด]


18

ฉันยังใหม่กับการทำงานกับ Windows Services แม้ว่าฉันจะเรียนรู้การสร้างWindows Services ใน VS2010ฉันต้องการทราบวิธีการปฏิบัติที่สามารถใช้บริการ windows ได้บ้าง?

ฉันลองใช้ Googling โดยคำนึงถึงบริบทปัจจุบันเท่านั้นเพื่อหาบทช่วยสอนเพิ่มเติมเกี่ยวกับวิธีสร้างบริการ Windows

แก้ไขเมื่อได้รับเงินรางวัล:

คำตอบทั้งหมดนั้นยอดเยี่ยม แต่ฉันกำลังมองหาตัวอย่างที่เป็นประโยชน์มากขึ้นเกี่ยวกับบริการ windows และความหมายของมัน สิ่งนี้จะช่วยให้นักพัฒนาทราบเมื่อเหมาะสมที่จะใช้กับกรณีศึกษา


28
ตัวอย่างการปฏิบัติ? ตอนนี้ทุกบริการที่ใช้งานบน Windows ของคุณจะเป็นอย่างไร
yannis

3
หรือ daemon ทุกตัวที่ทำงานบนกล่อง * nix ของคุณ
jk

1
ฉันชอบบันทึกดนตรีคลาสสิกจากวิทยุกระจายเสียง ด้วยโปรแกรมฉันจะต้องตื่นนอนตอนตี 2 แล้วกดปุ่ม "บันทึก" ด้วยบริการฉันสามารถกำหนดเวลาดำเนินการล่วงหน้าและนอนอย่างสงบสุข รายการโทรทัศน์ - บริการคือ VCR
Kilian Foth

คำตอบ:


42

บริการทำงานในพื้นหลังแม้ว่าจะไม่มีใครลงชื่อเข้าใช้เครื่อง ทุกสิ่งที่คุณสามารถจินตนาการได้ว่าต้องการทำโดยไม่ต้องพึ่งคนใดคนหนึ่งเพื่อเริ่มแอพและคลิกที่ปุ่มเป็นตัวเลือกที่ดีสำหรับบริการ ตัวอย่างเช่นการตรวจสอบโฟลเดอร์และเมื่อใดก็ตามที่ไฟล์ถูกเขียนไปให้ดำเนินการด้วยวิธีใดวิธีหนึ่ง "เซิร์ฟเวอร์" ใด ๆ ที่คุณนึกถึง - เว็บเซิร์ฟเวอร์, เซิร์ฟเวอร์ ftp, เซิร์ฟเวอร์อีเมล - เป็นบริการและมีกระบวนการพื้นหลังมากมายที่คุณอาจไม่นึกถึง

บางสิ่งที่ครั้งหนึ่งเคยถูกเขียนเป็นบริการ (ไฟล์สำรองที่ตี 2, ส่งอีเมลเตือนความจำเวลาตี 3 เป็นต้น) อาจจะทำได้ดีกว่าในวันนี้ตามภารกิจที่กำหนดไว้ซึ่งมีความยืดหยุ่นอย่างมากใน Windows 7 ขึ้นไป แต่หากนักพัฒนาไม่เคยเรียนรู้ ระบบจะต้องรองรับ XP คุณจะพบบริการที่ทำหน้าที่เหล่านั้น


1
+1 คำตอบที่ดี คุณตอบเตือนฉันว่าฉันแก้ไขการสำรองฐานข้อมูล ก่อนหน้านี้เราจะใช้การสำรองข้อมูลในการรันโพรซีเดอร์ SQL ในเซิร์ฟเวอร์ผ่านตัวกำหนดตารางเวลาซึ่งเรียกว่า exe exe ที่ใช้เพื่อป็อปอัพและเมื่อทำเสร็จแล้วจะถูกปิด ฉันคิดว่าบริการ windows เป็นตัวเลือกที่ดีกว่าที่นี่
Karthik Sreenivasan

8
ไม่มันไม่มี ภารกิจนั้นยังไม่จำเป็นต้องฟังการเชื่อมต่อ งานที่กำหนดเวลาไว้เป็นวิธีที่ถูกต้องในการแก้ปัญหาประเภทนั้น
ไวแอตต์บาร์เน็ตต์

2
ฉันกำลังทำงานที่กำหนดเวลาไว้จำนวนมากใน NTver <6.0 ด้วย . .
ไวแอตต์บาร์เน็ตต์

1
@ โพลีโนเมียล: งานที่กำหนดเวลาไว้สามารถทำงานภายใต้บัญชีใด ๆ สิ่งใดที่ทำงานโดยไม่ต้องใส่ข้อมูลจำเป็นต้องทำการบันทึกเพื่อที่คุณจะได้ทราบว่าเหตุใดจึงล้มเหลว
ไวแอตต์บาร์เน็ตต์

1
คำอธิบายที่ดี :) ระบบภาพปัจจุบันของ บริษัท ที่ฉันทำงานเพื่อใช้บริการ Windows อย่างกว้างขวางเพื่อจัดการกับการประมวลผลไฟล์ ตั้งแต่เวลาที่สแกนภาพเข้าสู่ระบบไปจนถึงการรอคิวสำหรับการจัดทำดัชนีจนถึงการเก็บถาวรจากนั้นในที่สุดการส่งภาพผ่านอีเมลการพิมพ์หรือแฟกซ์นับเป็นบริการทั้งหมดของ Windows
kelleystar

9

บริการบน Windows นั้นเป็นโปรแกรมที่ทำงานโดยไม่มี GUI เว็บเซิร์ฟเวอร์ (เช่น apache), เซิร์ฟเวอร์ฐานข้อมูล (เช่น mysql & sql server), โปรแกรมป้องกันไวรัสและเซิร์ฟเวอร์ / มิดเดิลแวร์ของแอปพลิเคชันเป็นตัวอย่างที่ใช้งานได้จริงของแอปพลิเคชั่นที่มักจะทำงานเป็นบริการ อาจมีไคลเอนต์ GUI เพื่อให้คุณสามารถโต้ตอบกับบริการได้ แต่บริการเองไม่มี มันทำงานเพียงแค่ 'อยู่เบื้องหลัง' ทำสิ่งนั้น นอกจากนี้เนื่องจากบริการต่างๆทำงานด้วยสิทธิ์ของผู้ใช้ที่ได้รับมอบหมายพวกเขาจึงสามารถทำงานในฐานะผู้ใช้ที่ได้รับมอบหมายไม่ว่าผู้ใช้จะเข้าสู่ระบบจริงหรือไม่ ดังนั้นเซิร์ฟเวอร์ฐานข้อมูลจะมีสิทธิ์การเข้าถึงเดียวกันโดยไม่คำนึงถึงบุคคลที่ล็อกอินเข้าสู่เครื่องในเวลานั้นถ้ามี ดังนั้นคุณจะเห็นได้ว่าทำไมถึงมีความสำคัญ - คุณไม่ต้องการให้ผู้ใช้เข้าสู่ระบบเพื่อให้เว็บเซิร์ฟเวอร์ทำงานต่อไป

พวกมันเทียบเท่ากับ Windows (ในวิธีการที่เป็นประโยชน์มากที่สุด) กับ Daemons บน * nix


5

บริการ

โปรแกรมประจำหรือกระบวนการที่ทำหน้าที่เฉพาะของระบบเพื่อรองรับโปรแกรมอื่น ๆ โดยเฉพาะอย่างยิ่งในระดับต่ำ (ใกล้กับฮาร์ดแวร์) เมื่อมีการให้บริการผ่านเครือข่ายพวกเขาสามารถเผยแพร่ใน Active Directory ช่วยอำนวยความสะดวกในการดูแลและใช้งานเป็นศูนย์กลาง

ฉันต้องการทราบวิธีการปฏิบัติที่สามารถใช้บริการ windows ได้บ้าง?

ตามการกำหนดบริการ Window Service และบริการประเภทอื่น ๆ มีฟังก์ชั่นมากมาย ในบริบทนี้เครื่องมือค้นหาเพื่อนของคุณ

โดยปกติจะใช้บริการของ Windows เมื่อแอปพลิเคชันต้องทำงานอย่างต่อเนื่อง คุณควรสร้างบริการของ Windows รหัสทำงานในพื้นหลังโดยไม่ต้องโต้ตอบกับผู้ใช้

บริการ Windows จะทำงานแม้ว่าจะไม่มีใครเข้าสู่ระบบ บริการ Windows สามารถเริ่มทำงานได้ทันทีที่เปิดเครื่องขึ้นซึ่งเหมาะอย่างยิ่งสำหรับการทำงานเป็นเซิร์ฟเวอร์เซิร์ฟเวอร์ http เป็นต้น ไม่จำเป็นต้องลงชื่อเข้าใช้

ตัวอย่างเช่นหากพวกเขาต้องการ:

  1. รอคำขอที่เข้ามา (เช่นผ่าน remoting หรือ wcf)
  2. ตรวจสอบคิวระบบไฟล์ ฯลฯ หากโปรแกรมต้องการทำงานเป็นระยะ ๆ เช่นวันละครั้ง ปกติแล้วมันจะง่ายต่อการสร้างงานที่กำหนดเวลาไว้ ..
  3. เซิร์ฟเวอร์ใด ๆ ที่ยอมรับการเชื่อมต่อ (เช่นเมลเว็บหรือเซิร์ฟเวอร์ FTP) ควรเป็นบริการของ Windows

ฉันจะใช้บริการด้วยเหตุผลดังต่อไปนี้:

  • คุณไม่จำเป็นต้องเปิดใช้งานเซสชัน นี่เป็นสิ่งที่ดีสำหรับความปลอดภัยและยังช่วยลดค่าใช้จ่ายบนเซิร์ฟเวอร์
  • คุณจะได้รับคำสั่งการจัดการบางอย่างในตัวฟรี
    o เริ่ม
    o หยุด
    o หยุดชั่วคราว
    o ดำเนินการต่อ

  • คุณสามารถจัดการเหตุการณ์เซิร์ฟเวอร์เช่นปิดเครื่อง

ลิงค์พร้อมข้อมูลเพิ่มเติมเกี่ยวกับบริการเหล่านี้:

ที่ Asp.net - // TODONT: ใช้บริการ Windows เพียงเพื่อเรียกใช้กระบวนการตามกำหนดเวลาการ
ใช้บริการ WIndows คืออะไร


เรียกใช้บริการ windows ด้วยสิทธิพิเศษสูงสุดได้อย่างไร งานกำหนดตารางเวลาสำหรับตัวอย่างคือมุมมองที่เป็นไปได้stackoverflow.com/a/11561410/206730 IMHO ตัวอย่างที่ดีกว่าสำหรับการลดช่วงการเรียนรู้คือแอปพลิเคชันจริงด้วยซอร์สโค้ดเต็มรูปแบบและรูปแบบที่ดี
Kiquenet

4

โปรแกรมแบบโต้ตอบเช่น winform หรือ WPF เป็นสิ่งที่คุณต้องการให้ผู้ใช้เปิดโต้ตอบกับและปิด ภารกิจที่กำหนดเวลาไว้เป็นสิ่งที่คุณต้องการเรียกใช้ในพื้นหลังตามเวลาที่กำหนด - อาจเพิ่งจะเริ่มทำบางสิ่งและหยุดทำงาน บริการของ Windowsเป็นสิ่งที่คุณต้องการที่จะทำงานตลอดเวลาในพื้นหลัง

ข้อดีของบริการ Windows คือการทำงานไม่ว่าผู้ใช้รายใดที่ลงชื่อเข้าใช้ (หรือแม้ว่าไม่มีผู้ใช้ที่ลงชื่อเข้าใช้) และสามารถตั้งค่าให้เริ่มการทำงานทันทีที่คอมพิวเตอร์บูทขึ้นซึ่งมีประโยชน์จริง ๆ หาก รีบูตระบบ

ฉันมักจะใช้บริการเมื่อต้องตรวจสอบบางอย่างเช่นโฟลเดอร์หรือกล่องจดหมายอีเมล


3

เมื่อคุณเพิ่มหมายเหตุเกี่ยวกับตัวอย่างที่เป็นประโยชน์กับคำถามของคุณฉันจะให้ตัวอย่างของบริการที่ฉันเขียนสำหรับแอปพลิเคชันองค์กร (คุณไม่ได้บอกว่าคุณเป็นโปรแกรมเมอร์ของแอปพลิเคชันองค์กร แต่ฉันเดาว่าโปรแกรมเมอร์ C # VS2010 ส่วนใหญ่) . ฉันคิดว่าคุณกำลังมองหาแนวคิดว่านักพัฒนาที่ไม่ทำงานกับ Microsoft อาจเขียนอะไร

บริการตรวจสอบ heartbeat ที่ตรวจสอบว่าโปรแกรมอื่นยังคงทำงานอยู่ (ซึ่งอาจทำงานเป็นงานตามกำหนดเวลาได้เช่นกัน แต่ถูกนำไปใช้เป็นบริการ)

บริการเขียนรายงานที่ทำงานผ่านคิวคำขอรายงานเรียกใช้รายงานและส่งไปยังเครื่องพิมพ์อื่น ๆ โดยขึ้นอยู่กับเครื่องพิมพ์ที่ไม่ว่าง สิ่งนี้ช่วยลดปริมาณงานที่พอใช้จากแอปพลิเคชันดั้งเดิมและอนุญาตให้ใช้รายงานร่วมกันโดยกล่องราคาถูกจำนวนมากที่ใช้บริการ

มันถูกนำมาใช้เป็นบริการเพื่อให้มันจะทำงานอย่างต่อเนื่องเริ่มต้นโดยอัตโนมัติในการรีบูตและสามารถใช้อินเตอร์เฟส windows services มาตรฐานเพื่อเริ่มหยุดหยุดชั่วคราว ฯลฯ นอกจากนี้หากเป็นงานที่กำหนดเวลาไว้มันจะต้อง เริ่มต้นรับข้อมูลจากโปรแกรมอื่นหรือแหล่งข้อมูลถาวร (คิวไฟล์ฐานข้อมูล) แทนที่จะใช้งานได้สำหรับโปรแกรมอื่นเพื่อโทร (ซ็อกเก็ตไปป์)

ส่วนเซิร์ฟเวอร์ของแอปพลิเคชันไคลเอนต์ / เซิร์ฟเวอร์นั้นยังได้รับการดำเนินการเป็นบริการเพื่อให้สามารถรีสตาร์ทเมื่อรีบูต ฯลฯ มีโครงการอื่นที่มี. exe ที่รันโปรแกรมเดียวกันไม่ใช่บริการเพื่อให้ง่ายขึ้น แก้ปัญหาบนเครื่องพัฒนา

ฉันหวังว่าจะช่วย คำตอบอื่น ๆ เป็นคำตอบทั่วไปที่ดีกว่าโดยเฉพาะอย่างยิ่งความคิดที่ว่างานที่กำหนดไว้อาจจะง่ายกว่าในการเขียนและบริหารเพื่อจุดประสงค์ส่วนใหญ่ในขณะนี้


+1 สำหรับการอธิบายว่าใช้บริการ windows อย่างละเอียดในที่ใด ฉันมีการเปิดเผยที่ จำกัด กับซ็อกเก็ต (รุ่นไคลเอ็นต์ - เซิร์ฟเวอร์การสื่อสารผ่าน IPAddress ผ่านพอร์ต) แต่ไม่ได้ใช้ไปป์ทั่วไป ท่อมีบทบาทคล้ายกันกับซ็อกเก็ตหรือไม่?
Karthik Sreenivasan

2

มีประโยชน์หลายอย่างสำหรับการบริการ การใช้งานจริงอย่างหนึ่งที่สำคัญคือการทำงานร่วมกันระหว่างโปรแกรม UI และบริการ (หรือ daemon ในระบบปฏิบัติการยูนิกซ์) ซึ่งในกรณีนี้ความแตกต่างระหว่างไคลเอนต์และเซิร์ฟเวอร์ เซิร์ฟเวอร์ได้รับคำขอประมวลผลคำขอและมักจะส่งคำตอบกลับ กล่าวอีกนัยหนึ่งมันทำหน้าที่ร้องขอ คิดเกี่ยวกับ SQLSERVER, IIS หรือ telnet ลูกค้ามักจะใช้เซิร์ฟเวอร์โดยส่งคำขอไปยังเซิร์ฟเวอร์แล้วแสดงหรือประมวลผลการตอบกลับ เช่นแอปพลิเคชันการป้อนข้อมูลเว็บแอปพลิเคชัน ... เซิร์ฟเวอร์เกือบทุกครั้งได้รับการติดตั้งเป็นบริการใน Windows (หรือ daemon ในระบบปฏิบัติการยูนิกซ์) และลูกค้ามักจะเป็นเพียงแอปทั่วไปที่มี gui มีการใช้บริการที่ซับซ้อนมากขึ้น แต่นี่คือสิ่งที่คุณอาจใช้บ่อยที่สุด

ตัวอย่างเช่น: ฉันกำลังทำงานบนเซิร์ฟเวอร์วิดีโอ SIP / H323 ได้รับคำขอจากแอปพลิเคชันโดยใช้ SDK ที่ฉันเขียนประมวลผลและตอบกลับ แอปพลิเคชันเซิร์ฟเวอร์วิดีโอได้รับการติดตั้งเป็น daemon บนเครื่อง linux แบบฝัง (จะเป็นบริการบนเครื่อง Windows แบบฝัง แต่ผู้ที่ใช้ Windows สำหรับการฝังตัวต่อไป) และแอปพลิเคชันใด ๆ ที่ใช้ SDK จะถือว่าเป็นไคลเอนต์

แน่นอนว่าคุณสามารถเขียนแอปพลิเคชันดังกล่าวและไม่ให้บริการ คุณยังสามารถทำให้พวกเขาเริ่มต้นเมื่อเริ่ม Windows และให้พวกเขาทำงานในพื้นหลัง อย่างไรก็ตามมันเกี่ยวข้องกับรายการรีจิสตรี้หลายรายการและการทำฟิงเกอร์ในรหัสของคุณ - ทำได้ง่ายกว่าการใช้ c api มากกว่าในสิ่งที่ต้องการ. NET Microsoft มีส่วนทำให้การสร้างบริการทำได้ง่ายขึ้นและทำให้เราสามารถลงทะเบียนกับระบบปฏิบัติการได้ง่ายกว่าและใช้งานง่ายกว่าทำด้วยตนเอง


+1 - เพียงเพื่อชี้แจงบริการโฮสต์ในเซิร์ฟเวอร์เป็นบริการ windows แล้ว SDK ไคลเอนต์ส่งข้อมูลไปยังเซิร์ฟเวอร์ผ่านพอร์ตเพื่อสื่อสารข้อมูลเพื่อรับข้อเสนอแนะ ความเข้าใจของฉันถูกต้องหรือไม่
Karthik Sreenivasan

1
@Karthik, คุณหมายถึงรูปแบบการออกแบบหรือตัวอย่างของฉัน? ถ้าเป็นในอดีต yes .. หรือ daemon ใน Unix การสื่อสารจะเป็นรูปแบบของ TCP / IP หากคุณอ้างถึงตัวอย่างของฉันเซิร์ฟเวอร์วิดีโอเป็น daemon บนเครื่อง linux ที่ฝังไว้ SDK สื่อสารผ่านพอร์ตเซิร์ฟเวอร์วิดีโอมีวงวนการฟังที่ใช้ในการประมวลผลคำขอของไคลเอ็นต์
Jonathan Henson

@Karthik ไม่ว่าจะเป็น TCP / IP หรือ Pipes ฉันเคยเห็นคนใช้สัญญาณที่มีช่องเสียบเพื่อทำการสื่อสารระหว่างกระบวนการ อย่างไรก็ตามรูปแบบการออกแบบเหมือนกัน วิธีการสื่อสารของคุณนั้นขึ้นอยู่กับสถาปนิกของโครงการ
Jonathan Henson

ฉันหมายถึงตัวอย่าง
Karthik Sreenivasan

2

ตัวอย่างของโปรแกรมผู้สมัคร:

  • ระบบที่ต้องตรวจสอบทรัพยากร / แอปพลิเคชั่นอื่น ๆ และส่งรายงาน (กิจกรรมของผู้ใช้การรับส่งไฟล์บางประเภทการแจ้งเตือนพฤติกรรมที่ไม่เหมาะสมของแอปพลิเคชัน)

  • ระบบที่ให้บริการแก่แอพพลิเคชั่นท้องถิ่นอื่น ๆ (แปล, แปลงไฟล์, ส่งข้อความระหว่างระบบ)

  • โปรแกรมแอนตี้ไวรัส.

ฉันคิดว่าสิ่งเหล่านี้เป็นตัวอย่างใหญ่ที่ไม่สามารถทำได้อย่างง่ายดายโดยใช้งานที่กำหนดไว้


+1 สำหรับตัวอย่าง คุณช่วยอธิบายสั้น ๆ เกี่ยวกับปริมาณการใช้ไฟล์?
Karthik Sreenivasan

1
ตัวอย่างเช่นหากคุณมีเว็บแอปพลิเคชันที่เห็น spikes เป็นระยะ ๆ ในการอัปโหลดไฟล์คุณต้องการแจ้งเตือนใครบางคน นอกจากนี้สิ่งนี้ยังใช้กับทรัพยากรใด ๆ ที่สามารถเห็นหนามแหลมในเวลาแปลก ๆ (เช่นปริมาณการใช้งานเว็บการใช้งานตัวประมวลผล) ที่อาจตรวจไม่พบโดยการตรวจสอบตามกำหนดเวลา (เนื่องจากนามแฝง)
linkerro

2

ตัวอย่างที่ฉันชอบในการใช้บริการ:

  1. เซิร์ฟเวอร์ - โปรแกรมที่ให้บริการการร้องขอจากไคลเอนต์ระยะไกล พวกเขามักจะเรียกใช้เป็นบริการเพื่อให้แน่ใจว่าพวกเขาจะพร้อมใช้งานไม่ว่าผู้ใช้ใด ๆ เข้าสู่เซิร์ฟเวอร์หรือไม่ การเรียกใช้เป็นบริการหมายความว่าเซิร์ฟเวอร์เริ่มประมวลผลการร้องขอทันทีที่เครื่องเริ่มทำงานไม่มีใครต้องเข้าสู่เครื่องเพื่อเริ่มโปรแกรมหลังจากที่รีสตาร์ทเครื่องด้วยเหตุผลใดก็ตาม เซิร์ฟเวอร์ฐานข้อมูลเป็นตัวอย่างที่ดี
  2. การประมวลผลเบื้องหลัง - โปรแกรมที่รับผิดชอบการประมวลผลข้อมูลจากแหล่งข้อมูลและเก็บผลลัพธ์ไว้ในเป้าหมายข้อมูล เป้าหมายข้อมูลมักจะเป็นแหล่งสำหรับกระบวนการอื่นและอื่น ๆ การทำงานเป็นบริการอนุญาตให้โปรแกรมเหล่านั้นนั่งอยู่ที่นั่นและรอให้ข้อมูลมาถึง นอกจากนี้ยังช่วยให้นักพัฒนาปรับปรุงความทนทานของการประมวลผลโดยแบ่งกระบวนการออกเป็นหลายขั้นตอนกึ่งอิสระ

+1 สำหรับเซิร์ฟเวอร์ฐานข้อมูล สิ่งที่กำลังตกอยู่ในสถานที่ เราทุกคนใช้ SqlConnection หรือ OledbConnection เพื่อเชื่อมต่อกับฐานข้อมูลซึ่งดำเนินการจริงโดยบริการที่อยู่ในเซิร์ฟเวอร์
Karthik Sreenivasan

2

นี่คือตัวอย่างการใช้แนวคิดบริการด้วยรหัสจริง (ด้านล่าง)

สิ่งที่ต้องทำคือการกำหนดค่าบัสบริการที่สิ้นเปลืองคิวและรับฟังข้อความจากเว็บเซิร์ฟเวอร์และไคลเอนต์ GUI

เมื่อได้รับข้อความมันทำสิ่งที่ตรรกะโดเมนรับประกันมันจะบันทึกเหตุการณ์ไปยังดิสก์และเผยแพร่เหตุการณ์เหล่านั้นไปที่นายหน้าข้อความ

แอปพลิเคชันขนาดใหญ่ส่วนใหญ่ที่ทำงานควบคู่กันอย่างหลวม ๆ ใช้สถาปัตยกรรม "ผู้ปฏิบัติงาน" บางอย่างเช่นสิ่งที่อยู่ด้านล่าง

โครงการ Documently เป็นโครงการตัวอย่างที่เราสร้างขึ้นสำหรับคนอย่างคุณเพื่อเรียนรู้สถาปัตยกรรมแบบกระจาย คุณสามารถถามคำถามกับฉันโดยตรงในโครงการหรือแยกมันและใช้คุณสมบัติบางอย่างเพื่อเรียนรู้จากนั้นส่งคำขอดึง (และรับรหัสความคิดเห็น)

https://github.com/haf/Documently/blob/master/src/Documently.Domain.Service/Program.cs :

using System.Threading;
using Castle.MicroKernel.Registration;
using Castle.Windsor;
using Documently.Infrastructure;
using Documently.Infrastructure.Installers;
using MassTransit;
using Topshelf;
using log4net;
using log4net.Config;

namespace Documently.Domain.Service
{
    class Program
    {
        private static readonly ILog _Logger = LogManager.GetLogger(typeof (Program));

        private IWindsorContainer _Container;
        private IServiceBus _Bus;

        public static void Main(string[] args)
        {
            Thread.CurrentThread.Name = "Domain Service Main Thread";
            HostFactory.Run(x =>
            {
                x.Service<Program>(s =>
                {
                    s.ConstructUsing(name => new Program());
                    s.WhenStarted(p => p.Start());
                    s.WhenStopped(p => p.Stop());
                });
                x.RunAsLocalSystem();

                x.SetDescription("Handles the domain logic for the Documently Application.");
                x.SetDisplayName("Documently Domain Service");
                x.SetServiceName("Documently.Domain.Service");
            });
        }

        private void Start()
        {
            XmlConfigurator.Configure();
            _Logger.Info("setting up domain service, installing components");

            _Container = new WindsorContainer()
                .Install(
                    new RavenDbServerInstaller(),
                    new CommandHandlerInstaller(),
                    new EventStoreInstaller(),
                    new BusInstaller(Keys.DomainServiceEndpoint)
                    );

            _Container.Register(Component.For<IWindsorContainer>().Instance(_Container));
            _Bus = _Container.Resolve<IServiceBus>();

            _Logger.Info("application configured, started running");
        }

        private void Stop()
        {
            _Logger.Info("shutting down Domain Service");
            _Container.Release(_Bus);
            _Container.Dispose();
        }
    }
}

+1 สำหรับการอธิบายด้วยตัวอย่าง ฉันจะลองใช้ตัวอย่างของคุณเพื่อทำความเข้าใจให้ดีขึ้น
Karthik Sreenivasan

2

ก่อนหน้านี้ทีมของฉันใช้บริการ windows 3 แห่งในธนาคารที่นี่ในบราซิลดังนี้:

  • อินเทอร์เฟซระหว่างระบบ: เรามีแอปพลิเคชั่นสำนักงานด้านหน้าที่รับผิดชอบการจองการซื้อขายในตลาดหุ้นและแอปพลิเคชันแบ็คออฟฟิศที่รับผิดชอบการบัญชีและการคำนวณค่าธรรมเนียมการซื้อขาย เริ่มแรกการสื่อสารระหว่างระบบเกิดขึ้นโดยตรงบน SQL Server แต่ปัญหาการล็อคและการเก็บข้อมูลมากเกินไปทำให้ระบบประสบปัญหาประสิทธิภาพการทำงานต่ำ บริการถูกนำไปใช้เพื่อเชื่อมต่อกับฐานข้อมูลด้านหน้าและด้านหลังและทำการอ่าน / เขียนที่เหมาะสมโดยใช้กลยุทธ์การเก็บรักษาบางประเภท (แทนที่จะเขียนทุก ๆ การค้าบน SQL Server เราเก็บข้อมูลไว้เพื่อขยายการค้า 1,000 รายการและ ทำเม็ดมีดจำนวนมากซึ่งเร็วกว่าโซลูชันเดิมถึง 40x และไม่ได้ล็อคตารางที่เกี่ยวข้องจำนวนมากเป็นเวลานาน)

  • Message Queue: พร้อมกับวิธีแก้ไขปัญหาก่อนหน้านี้เราได้เขียนตัวจัดการคิวข้อความที่กำหนดเองดังนั้นโพรซีเดอร์การประมวลผลแบบแบตช์หลายตัวสามารถรันแบบอะซิงโครนัสได้ ที่รวมเข้ากับทั้ง MSMQ และ IBM-MQSeries

  • การรวมศูนย์บริการธุรกิจ: แอปพลิเคชันผู้ใช้จำนวนมากต้องการข้อมูลทั่วไปเช่นราคาหุ้นดังนั้นเราจึงเขียนบริการที่กำหนดเองที่รับผิดชอบในการรับ "คำขอราคา" และส่งข้อมูลราคากลับไป

หนึ่งในแง่มุมที่ทำให้เราเขียนบริการแทน "หุ่นยนต์" คือบริการสามารถทำงานในฐานะผู้ใช้เฉพาะ (ตามที่มีคนชี้ให้เห็นในหัวข้อนี้) และสามารถเริ่มต้นโดยอัตโนมัติเมื่อบูทเครื่องขึ้น

บริการไม่จำเป็นต้องมีเดสก์ท็อปหรือบริการจัดการหน้าต่างเพื่อเรียกใช้ พวกเขาสามารถทำงานบนพื้นหลัง (ดีพวกเขาจะต้องทำงานบนพื้นหลัง)

และถ้าคุณเป็นเหมือนเพื่อนร่วมงานบางคนที่ไม่ชอบเขียนส่วนต่อประสานผู้ใช้บริการเป็นความท้าทายทางเทคโนโลยีที่ยิ่งใหญ่เพราะโดยปกติแล้วพวกเขาจะต้องไม่ล้มเหลว ดังนั้นมันสนุกมากที่จะเขียนบริการ :)


+1 ตัวอย่างสด จากคำตอบที่ดีจากทุกคนที่นี่ฉันได้รับความเข้าใจที่ดีขึ้นเกี่ยวกับการใช้บริการ windows ที่เหมาะสมและฉันคิดว่าโปรแกรมเมอร์คนอื่น ๆ จะได้ประโยชน์จากการแบ่งปันความรู้ที่นี่อย่างแน่นอน การใช้งานบางอย่างที่ฉันเคยทำงานในอดีตอาจทำได้ดีขึ้นโดยใช้บริการ windows
Karthik Sreenivasan

0

หากคุณกำลังออกแบบแอปพลิเคชันเดสก์ท็อป Windows ที่ต้องใช้งานในฐานะผู้ใช้มาตรฐาน แต่บางครั้งก็จำเป็นต้องทำงานที่ต้องใช้สิทธิ์ผู้ดูแลระบบคุณสามารถใช้บริการได้

โปรแกรมติดตั้งของคุณติดตั้งบริการด้วยสิทธิ์ที่จำเป็นแอปพลิเคชันเดสก์ท็อปของคุณโทรเข้าใช้บริการเมื่อต้องการทำงานที่มีสิทธิ์ผู้ดูแลระบบ

มีผลกระทบด้านความปลอดภัยต่อวิธีการนี้ซึ่งอยู่นอกเหนือขอบเขตของคำตอบนี้


ถ้าฉันเข้าใจถูกต้องจะไม่สามารถเรียกบริการ windows โดยไม่ได้รับอนุญาตจากผู้ดูแลระบบ?
Karthik Sreenivasan

2
ไม่ไม่สามารถติดตั้งหรือเริ่มบริการ Windows โดยไม่ได้รับอนุญาตจากผู้ดูแลระบบ แต่ผู้ใช้ใด ๆ สามารถสื่อสารกับพวกเขาหากบริการกำลังฟัง (คิดซ็อกเก็ตชื่อไปป์ ฯลฯ )
Eclipse

1
แน่นอนผู้ใช้มาตรฐานสามารถเริ่มต้นและโทรเข้าใช้บริการ windows บริการจะต้องติดตั้งโดยผู้ใช้ผู้ดูแลระบบ
Jim In Texas

0

สำหรับโปรแกรมเมอร์เหตุผลหลักในการใช้บริการคือ:

  • โปรแกรมนี้ต้องเริ่มทำงานโดยอัตโนมัติในเครื่อง Windows หลังจากรีบูต

สิ่งใดก็ตามที่คุณเขียนซึ่งต้องสอดคล้องกับข้างต้นจะต้องเรียกใช้เป็นบริการ Windows


0

บริการที่มีประโยชน์ที่สุดที่ฉันเขียนจากมุมมองของผู้ใช้:
* ผู้ใช้พิมพ์ใบแจ้งหนี้ UGLY บนเครื่องพิมพ์ดอทเมทริกซ์พร้อมไดรเวอร์ RAW สำหรับพิมพ์
* ผู้ใช้ต้องการใบแจ้งหนี้สวยที่มีโลโก้กราฟิกเส้นเรียบ
* ไม่สามารถเข้าถึงรหัสเดิมได้

บริการจะ:
* ตรวจสอบโฟลเดอร์เครื่องพิมพ์ (หลายรายการ) สำหรับงานพิมพ์
* สร้าง PDF ของใบแจ้งหนี้
* PDF จะ "ขีดเส้นใต้" ภาพใบแจ้งหนี้เปล่าที่ดี
* วางซ้อนข้อความดิบ
* ค้นหาข้อมูลเมตาตามโฟลเดอร์ที่ใช้ (IE: เครื่องพิมพ์ที่ใช้)

จากนั้นข้อมูลเมตาจะ:
* สร้าง PDF
* และ / หรือพิมพ์ PDF
* และ / หรือไฟล์ PDF ไปยังโฟลเดอร์ปลายทางสุดท้าย
* และ / หรือลบ PDF
* และ / หรือส่งอีเมลใบแจ้งหนี้ PDF ให้กับลูกค้า

ในกรณีนี้มันจัดการกับ ghost-script, PLC และ PDF engine มันทำงานอย่างหมดจดเป็นเวลาหลายปี รวมถึงไฟล์บันทึก !!!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.