บริการมีจุดสิ้นสุดของแอปพลิเคชันเป็นศูนย์ (ไม่ใช่โครงสร้างพื้นฐาน)


91

ฉันเพิ่งสร้างบริการ WCF (dll) และโฮสต์บริการ (exe) ฉันรู้ว่าบริการ WCF ของฉันทำงานอย่างถูกต้องเนื่องจากฉันสามารถเพิ่มบริการลงใน WcfTestClient ได้สำเร็จ

อย่างไรก็ตามดูเหมือนว่าฉันกำลังประสบปัญหาเมื่อต้องใช้ WCF จากโฮสต์บริการ (exe) ฉันสามารถเพิ่มการอ้างอิงถึง WCF (dll) ให้กับโฮสต์บริการของฉัน (exe) และสร้างส่วนประกอบที่จำเป็นให้กับ exe เช่นตัวติดตั้งบริการโฮสต์บริการและ app.config คอมไพล์แล้วสุดท้ายติดตั้ง exe โดยใช้ InstallUtil แต่เมื่อฉันพยายามเริ่มบริการใน Microsoft Management Console บริการจะหยุดทันทีหลังจากเริ่มต้น

ดังนั้นฉันจึงเริ่มตรวจสอบสิ่งที่อาจทำให้เกิดปัญหานี้และเกิดข้อผิดพลาดนี้จากบันทึกแอปพลิเคชันใน Event Viewer

คำอธิบาย:

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

ข้อผิดพลาดนี้เกิดขึ้นจริงในOnStart; ของ exe ของฉันเมื่อฉันทำการโทรServiceHost.Open()นี้ ฉันเคยเห็นโพสต์มากมายที่มีบุคคลอื่นประสบปัญหานี้ แต่ส่วนใหญ่หากไม่ใช่ทั้งหมดอ้างว่าชื่อบริการหรือสัญญา ไม่ได้ระบุเนมสเปซและชื่อคลาส ฉันตรวจสอบทั้งสองรายการเหล่านี้ในไฟล์กำหนดค่าของฉัน ใน exe เช่นเดียวกับใน dll และตรงกันอย่างสมบูรณ์แบบ ฉันเคยให้คนอื่น ๆ ในสำนักงานตรวจสอบข้างหลังฉันอีกครั้งเพื่อให้แน่ใจว่าฉันจะไม่ตาบอดในจุดใดจุดหนึ่ง แต่แน่นอนว่าพวกเขาได้ข้อสรุปเช่นเดียวกับฉันว่าทุกอย่างดูเหมือนระบุไว้อย่างถูกต้อง ฉันกำลังหลงทางกับสิ่งที่เกิดขึ้น ณ จุดนี้ ใครช่วยฉันแก้ปัญหานี้ได้บ้าง

อีกสิ่งหนึ่งที่เป็นสาเหตุที่เป็นไปได้ที่อาจเกิดขึ้นคือ app.config จะไม่ถูกอ่าน; อย่างน้อยก็ไม่ใช่เรื่องที่ฉันคิดว่าควรจะอ่าน นี่อาจเป็นปัญหาหรือไม่? ถ้าเป็นเช่นนั้นฉันจะแก้ไขปัญหานี้ได้อย่างไร อีกครั้งความช่วยเหลือใด ๆ จะได้รับการชื่นชม


2
ข้อกำหนดของสัญญาบริการต้องคัดลอกจาก service.dll.config ไปยัง service.exe.config
John Saunders

1
คุณช่วยแสดง app.config ของบริการให้เราดูได้ไหม ?? คุณทำอะไรเป็นพิเศษในบริการ NT เพื่อสร้างอินสแตนซ์ / เปิด ServiceHost หรือไม่?
marc_s

คำตอบ:


94

ฉันเพิ่งมีปัญหานี้และได้รับการแก้ไขโดยการเพิ่มเนมสเปซในชื่อบริการเช่น

 <service name="TechResponse">

กลายเป็น

 <service name="SvcClient.TechResponse">

ฉันยังเห็นว่ามันได้รับการแก้ไขด้วย Web.config แทนที่จะเป็น App.config


ใช่เราเปลี่ยนเนมสเปซจึงไม่พบบริการที่ตรงกับชื่อในไฟล์. svc (ขีดล่างถูกสลับด้วยจุด!) การตรวจสอบชื่อบริการอย่างรวดเร็วเปิดเผยว่ามีอะไรเกิดขึ้น

1
แก้ไขปัญหาของฉันได้เช่นกันชอบการแก้ไขที่ง่ายและรวดเร็วเหล่านี้!
vfilby

การเพิ่ม web.config ช่วยแก้ไขข้อผิดพลาดนี้ให้ฉัน
Ryan Rodemoyer

2
นี่แก้ปัญหาของฉันได้ !!! ขอบคุณมาก! สำหรับมือใหม่อย่างฉัน: แนะนำบทช่วยสอนที่ชัดเจนจริงๆ: lourenco.co.za/blog/2013/08/…
Homer1982

12

จุดสิ้นสุดควรมีเนมสเปซ:

 <endpoint address="uri" binding="wsHttpBinding" contract="Namespace.Interface" />

ฉันมีสิ่งนี้ใน app.config แต่ฉันต้องการเปลี่ยนในรหัสโดยไม่ต้องลบออกจาก app.config การใช้ ServiceHost ใหม่กับที่อยู่ปลายทางใหม่ทำให้เกิดข้อผิดพลาด
Paul McCarthy

9

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

จอห์นน่าจะถูกต้องว่าเป็นปัญหาไฟล์. config WCF มักจะมองหา .config ดังนั้นหากคุณโฮสต์ WCF ของคุณในบริบทการดำเนินการที่แตกต่างกัน (นั่นคือทดสอบกับแอปพลิเคชันคอนโซลและปรับใช้กับ WS) คุณต้องแน่ใจว่าคุณได้ย้ายข้อมูลการกำหนดค่า WCF ไปยังไฟล์. config ที่เหมาะสม แต่ปัญหาพื้นฐานสำหรับฉันคือคุณไม่รู้ว่าปัญหาคืออะไรเพราะ WS goo เข้ามาขวางทาง หากคุณยังไม่ได้ปรับโครงสร้างใหม่เพื่อให้คุณสามารถเรียกใช้บริการของคุณในบริบทใด ๆ (นั่นคือการทดสอบหน่วยหรือคอนโซล) ฉันจะทำเช่นนั้น หากคุณหมุนบริการของคุณในการทดสอบหน่วยอาจจะล้มเหลวในลักษณะเดียวกับที่คุณเห็นด้วย WS ซึ่งง่ายกว่ามากในการดีบั๊กแทนที่จะพยายามทำเช่นนั้นกับท่อประปา WS ที่ไม่ดี


1
ขอบคุณสำหรับการตอบกลับอย่างรวดเร็ว ฉันคัดลอก app.config ของฉันจาก WCF (dll) ของฉันดังนั้นฉันจึงไม่คิดว่าเป็นปัญหา แต่ฉันพบว่ามันแปลกที่ฉันสามารถนำ WCF (dll) ของฉันขึ้นมาโดยใช้ WcfTestclient.exe โดยไม่มีปัญหาใด ๆ สำหรับฉันแล้วดูเหมือนว่ามีอะไรผิดพลาดกับไฟล์ config มันก็น่าจะล้มเหลวเช่นกันไม่ใช่แค่เมื่อฉันพยายามเรียกใช้ใน Windows Service Host (exe) ขออภัยหากเสียงหายไปเล็กน้อยเนื่องจากฉันยังคงเป็นมือใหม่ที่ WCF และช่วงเวลาให้บริการ ข้อเสนอแนะอื่น ๆ ?
user280626

9

เพียงคัดลอกไฟล์ App.config จากโปรเจ็กต์บริการไปยังแอปพลิเคชันโฮสต์คอนโซลและวางที่นี่จากนั้นลบออกจากโปรเจ็กต์บริการ


5

ฉันได้รับข้อยกเว้นโดยละเอียดมากขึ้นเมื่อฉันเพิ่มโดยทางโปรแกรม - AddServiceEndpoint:

string baseAddress = "http://" + Environment.MachineName + ":8000/Service";
ServiceHost host = new ServiceHost(typeof(Service), new Uri(baseAddress));  

host.AddServiceEndpoint(typeof(MyNamespace.IService),
                        new BasicHttpBinding(), baseAddress);
host.Open();

1
ขอบคุณ! การส่งที่อยู่ด้วยวิธีนี้ทำให้ฉันทราบรายละเอียดเพิ่มเติมเกี่ยวกับข้อยกเว้น ในกรณีของฉันมันเป็นเพียงการใช้พอร์ตโดยกระบวนการอื่น :)
Hernan Veiras

ฉันมีปัญหาเดียวกันคือที่อยู่ฐานเดียวกันกับที่อยู่เมื่อคุณคลิกค้นหาในการอ้างอิงเพิ่มบริการหรือไม่
ZoomVirus

4

ในการเตรียมการกำหนดค่าสำหรับ WCF นั้นยากและบางครั้งคำจำกัดความประเภทบริการก็ไม่มีใครสังเกตเห็น

ฉันเขียนเฉพาะเนมสเปซในแท็กบริการดังนั้นฉันจึงได้รับข้อผิดพลาดเดียวกัน

<service name="ServiceNameSpace">

อย่าลืมแท็กบริการจำเป็นต้องมีชื่อคลาสบริการที่มีคุณสมบัติครบถ้วน

<service name="ServiceNameSpace.ServiceClass">

สำหรับคนอื่น ๆ ที่เป็นเหมือนฉัน


1
คุณหมายถึงอย่างที่ฉันตอบเมื่อสี่ปีก่อนใช่ไหม
SteveCav

ดูเหมือนกัน แต่มีความแตกต่างอย่างหนึ่ง ตัวอย่างที่ไม่ถูกต้องของคุณเกี่ยวกับการเขียนเฉพาะชื่อคลาส ( TechResponse) แต่ของฉันเขียนเฉพาะเนมสเปซ ( ServiceNameSpace)
Uğur Aldanmaz

4

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

ในขณะที่จัดโครงสร้างโค้ดใหม่ฉันได้เปลี่ยนคลาสบริการและชื่อ IService แล้วและเปลี่ยน ServiceHost ให้ชี้ไปที่ชื่อคลาสบริการใหม่นี้ (ดังแสดงในข้อมูลโค้ด) แต่ในแอปพลิเคชันโฮสต์ของฉันไฟล์ Config ฉันยังคงใช้ชื่อคลาสบริการเก่า . (อ้างถึงฟิลด์ชื่อของส่วน config ในตัวอย่างด้านล่าง)

นี่คือข้อมูลโค้ด

 ServiceHost myServiceHost = new ServiceHost(typeof(NewServiceClassName)); 

และในไฟล์ App.config ภายใต้ส่วนบริการฉันอ้างถึงชื่อ serviceclass เก่าเปลี่ยนเป็น New ServiceClassName แก้ไขปัญหาสำหรับฉัน

  <service name="ProjectName.OldServiceClassName"> 
        <endpoint address="" binding="basicHttpBinding" contract="ProjectName.IService">
          <identity>
            <dns value="localhost"/>
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
        <host>
          <baseAddresses>
            <add baseAddress=""/>
          </baseAddresses>
        </host>
      </service>

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

3

ผมมีปัญหาเหมือนกัน. ทุกอย่างทำงานใน VS2010 แต่เมื่อฉันเรียกใช้โครงการเดียวกันใน VS2008 ฉันได้รับข้อยกเว้นดังกล่าว

สิ่งที่ฉันทำในโครงการ VS2008 เพื่อให้มันใช้งานได้คือการเพิ่มการโทรไปยังAddServiceEndpointสมาชิกของวัตถุ ServiceHost ของฉัน

นี่คือข้อมูลโค้ดของฉัน:

Uri baseAddress = new Uri("http://localhost:8195/v2/SystemCallbackListener");

ServiceHost host = new ServiceHost(typeof(SystemCallbackListenerImpl), baseAddress);

host.AddServiceEndpoint(typeof(CsfServiceReference.SystemCallbackListener),
                        new BasicHttpBinding(),
                        baseAddress);
host.Open();

ฉันไม่ได้แก้ไขไฟล์ app.config แต่ฉันเดาว่าอาจมีการเพิ่มจุดสิ้นสุดบริการในไฟล์. config


เมื่อฉันใช้วิธีนี้ฉันจะได้รับ AddressAccessDeniedException แม้ว่าฉันจะสามารถใช้ที่อยู่นี้สำหรับที่อยู่ addServiceReferance
ZoomVirus

2

ฉันเพิ่งแก้ไขปัญหานี้ในบริการของฉัน นี่คือข้อผิดพลาดที่ฉันได้รับ:

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

นี่คือสองขั้นตอนที่ฉันใช้ในการแก้ไข:

  1. ใช้ชื่อคลาสแบบเต็มที่ถูกต้อง:

    <service behaviorConfiguration="DefaultBehavior" name="EmailSender.Wcf.EmailService">
    
  2. เปิดใช้งานปลายทางด้วย mexHttpBinding และที่สำคัญที่สุดคือใช้สัญญา IMetadataExchange:

    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
    

2

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

จำความคิดเห็นนี้จากการกำหนดค่า:

เมื่อปรับใช้โปรเจ็กต์ไลบรารีบริการเนื้อหาของไฟล์กำหนดค่าต้องถูกเพิ่มลงในไฟล์ app.config ของโฮสต์ System.Configuration ไม่สนับสนุนไฟล์กำหนดค่าสำหรับไลบรารี

หากคุณมีบริการ WCF ที่โฮสต์ใน IIS ระหว่างรันไทม์ผ่าน VS.NET โปรแกรมจะอ่าน app.config ของโปรเจ็กต์ไลบรารีบริการ แต่อ่าน web.config ของโฮสต์เมื่อปรับใช้แล้ว หาก web.config ไม่มีการ<system.serviceModel>กำหนดค่าที่เหมือนกันคุณจะได้รับข้อผิดพลาดนี้ ตรวจสอบให้แน่ใจว่าได้คัดลอกการกำหนดค่าจาก app.config เมื่อเสร็จสมบูรณ์แล้ว


2

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

ตัวอย่างเช่นถ้าชื่อคลาสคือ CalculatorService และไฟล์คอนฟิกูเรชันอ้างถึง Calculatorservice ... คุณจะได้รับข้อผิดพลาดนี้


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

2

ฉันใช้ Visual Studio ในโหมดผู้ดูแลระบบและมันใช้ได้สำหรับฉัน :) นอกจากนี้ตรวจสอบให้แน่ใจว่าไฟล์ app.config ที่คุณใช้สำหรับเขียนการกำหนดค่า WCF ต้องอยู่ในโครงการที่ใช้คลาส "ServiceHost" ไม่ใช่ในบริการ WCF จริง โครงการ.


สิ่งนี้ช่วยฉันประหยัดเวลาได้มาก :)
Parag

1

ปัญหาของฉันคือเมื่อฉันเปลี่ยนชื่อคลาส Service1 เริ่มต้นสำหรับไฟล์. svc เป็นชื่อที่มีความหมายมากขึ้นซึ่งทำให้ web.config behaviorConfiguration และ endpoint สอดคล้องกับหลักการตั้งชื่อแบบเก่า ลองแก้ไข web.config ของคุณ


1

สิ่งสำคัญอย่างหนึ่งที่ต้องจำไว้สำหรับผู้ที่ทำงานกับแอปพลิเคชันคอนโซลเพื่อโฮสต์บริการ WCF คือไฟล์Web.configในโครงการ WCF จะถูกละเว้นโดยสิ้นเชิง หากsystem.serviceModelการกำหนดค่าของคุณอยู่ที่นั่นคุณจะต้องย้ายส่วนการกำหนดค่านั้นไปที่App.configของโครงการ Console ของคุณ

นอกจากนี้ยังมีคำตอบเกี่ยวกับการตรวจสอบว่าเนมสเปซถูกระบุในตำแหน่งที่ถูกต้อง


1

เป็นเบาะแสอื่นที่แก้ไขปัญหานี้ในกรณีของฉันได้อย่างแท้จริง

ฉันกำลังย้ายบริการ WCF บางอย่างจากแอปพลิเคชันคอนโซล (ซึ่งกำหนดค่าในบริการ WCF ของโค้ดเพียงไม่กี่รายการ) ไปยัง Azure WebRole เพื่อเผยแพร่ใน Azure ทุกครั้งที่ฉันเพิ่มบริการใหม่ VS แก้ไข web.config ของฉันและเพิ่มบรรทัดนี้:

<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true">

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

<service name="FirstService" behaviorConfiguration="metadataBehavior">
                <endpoint address=""
                 binding="wsHttpBinding"
                 bindingConfiguration="WSHttpBinding_WcfServicesBinding"
                 contract="IFirstService" />

            </service>

แต่เมื่อฉันเพิ่มบริการที่สองมันหยุดทำงานและฉันตระหนักว่าคุณลักษณะเหล่านั้นอยู่ที่นั่นอีกครั้ง

ฉันหวังว่ามันจะช่วยคุณประหยัดเวลา


0

ฉันมีข้อผิดพลาดนี้ในบริการ Windows เมื่อ WCF Service Library ที่ฉันสร้างขึ้นไม่ได้เชื่อมต่อกับโฮสติ้ง แต่เชื่อมต่อเพื่อการเชื่อมต่อ ฉันไม่มีจุดสิ้นสุด (ฉันต้องการทั้งการเชื่อมต่อและโฮสติ้งในบริการ Windows ของฉันเพื่อที่ฉันจะสามารถให้บริการ WCF กับการเชื่อมต่ออื่น ๆ รวมถึงให้กระบวนการหลักของบริการ Windows ของฉันใช้มันด้วยเพื่อทำงานต่างๆตามตัวจับเวลา / กำหนดเวลา)

การแก้ไขคือฉันคลิกขวาที่ไฟล์ App.config ของฉันและเลือกแก้ไขการกำหนดค่า WCF จากนั้นฉันทำตามขั้นตอนในการสร้างบริการเพื่อที่ฉันจะสามารถเชื่อมต่อกับบริการ WCF ของฉันได้ ตอนนี้ฉันมีจุดสิ้นสุดสองจุดใน App.config ไม่ใช่แค่จุดเดียว จุดสิ้นสุดหนึ่งใช้สำหรับการเชื่อมต่อกับ WCF Service Library และอีกจุดหนึ่งสำหรับการโฮสต์

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