ข้อผิดพลาดในการอ้างอิงบริการ: ไม่สามารถสร้างรหัสสำหรับการอ้างอิงบริการ


131

ฉันมี Windows Service Solution และกำลังพยายามเพิ่มการอ้างอิงบริการไปยังบริการเว็บ Hermes (เซิร์ฟเวอร์ข้อความ Opensource ebms) ใน VS2010

ฉันสามารถค้นหา Web Service โดยใช้ URL แต่เมื่อฉันพยายามเติมข้อมูลอ้างอิงบริการฉันได้รับข้อผิดพลาดต่อไปนี้ใน Visual Studio:

Error 8 Custom tool error: Failed to generate code for the service reference 'testService'.  Please check other error and warning messages for details. C:\Users\Admin\documents\visual studio 2010\Projects\MyProject\MyProject.MessageHandler\Service References\testService\Reference.svcmap 1 1 MyProject.MessageHandler


Warning 6 Custom tool warning: Cannot import wsdl:binding
Detail: There was an error importing a wsdl:portType that the wsdl:binding is dependent on.
XPath to wsdl:portType: //wsdl:definitions[@targetNamespace='http://service.ebms.edi.cecid.hku.hk/']/wsdl:portType[@name='EbmsStatusQuery']
XPath to Error Source: //wsdl:definitions[@targetNamespace='http://service.ebms.edi.cecid.hku.hk/']/wsdl:binding[@name='EbmsSoapHttpStatusQuery'] C:\Users\Admin\documents\visual studio 2010\Projects\MyProject\MyProject.MessageHandler\Service References\testService\Reference.svcmap 1 1 MyProject.MessageHandler

Warning 7 Custom tool warning: Cannot import wsdl:port
Detail: There was an error importing a wsdl:binding that the wsdl:port is dependent on.
XPath to wsdl:binding: //wsdl:definitions[@targetNamespace='http://service.ebms.edi.cecid.hku.hk/']/wsdl:binding[@name='EbmsSoapHttpStatusQuery']
XPath to Error Source: //wsdl:definitions[@targetNamespace='http://service.ebms.edi.cecid.hku.hk/']/wsdl:service[@name='EbmsMessageStatusQuery']/wsdl:port[@name='EbmsStatusQuery'] C:\Users\Admin\documents\visual studio 2010\Projects\MyProject\MyProject.MessageHandler\Service References\testService\Reference.svcmap 1 1 MyProject.MessageHandler

Warning 5 Custom tool warning: Cannot import wsdl:portType
Detail: An exception was thrown while running a WSDL import extension: System.ServiceModel.Description.XmlSerializerMessageContractImporter
Error: Schema with target namespace 'http://service.ebms.edi.cecid.hku.hk/' could not be found.
XPath to Error Source: //wsdl:definitions[@targetNamespace='http://service.ebms.edi.cecid.hku.hk/']/wsdl:portType[@name='EbmsStatusQuery'] C:\Users\Admin\documents\visual studio 2010\Projects\MyProject\MyProject.MessageHandler\Service References\testService\Reference.svcmap 1 1 MyProject.MessageHandler

การตรวจสอบบางอย่างดูเหมือนจะแนะนำว่าเป็นเพราะ svcutil.exe ไม่สามารถสร้างพร็อกซีได้เนื่องจากไม่มีสิทธิ์ไปยังไดเร็กทอรี (อาจเป็น c: \ windows \ temp) ฉันได้ลองกำหนดสิทธิ์การเข้าถึงต่างๆแล้ว แต่ฉันไม่แน่ใจว่าผู้ใช้รายใดต้องได้รับอนุญาตหรือเป็นเพียงปลาเฮอริ่งแดง

ความคิดใด ๆ ที่จะได้รับการชื่นชมอย่างมาก.

ขอบคุณ

คำตอบ:


303

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

ตรวจสอบรายละเอียด


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

ผมอยากแก้ปัญหาได้โดยไม่ต้องยกเลิกการเลือก "ประเภทนำมาใช้ใหม่" และฉันจัดการเพื่อหาคนที่ทำงานให้ดูคำตอบของฉันที่นี่
Shahin Dohan

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

ตรวจสอบให้แน่ใจว่าโครงการของคุณไม่ได้อ่านอย่างเดียว.. นี่คือปัญหาของฉัน ..
arihanth jain

126

คลิกขวาที่ข้อมูลอ้างอิงบริการของคุณแล้วเลือก Configure Service Reference...

กำหนดค่าการอ้างอิงบริการ

จากนั้นยกเลิกการเลือก Reuse types in referenced assemblies

ประเภทการใช้ซ้ำ

คลิกOKทำความสะอาดและสร้างโซลูชันของคุณใหม่


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

สิ่งนี้เกิดขึ้นเมื่อฉันอัปเกรดจาก v4.6.1 เป็น v4.7 ด้วยโครงการของฉัน สิ่งนี้แก้ไขได้
Mike Flynn

17

ฉันยังพบข้อผิดพลาดที่คล้ายกันเมื่อพยายามสร้างไคลเอนต์สำหรับบริการเว็บจากโครงการ ASP .Net MVC 4.0 โดยใช้ Visual Studio 2012

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

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

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

ตัวอย่างเช่นหากบริการนั้นสร้างขึ้นโดยใช้ WCF และพารามิเตอร์วิธีการบางอย่างภายในเป็นประเภท System.Guid จะถูกแปลเป็นสตริงในไคลเอนต์ที่สร้างขึ้นหากปิดใช้งานตัวเลือกประเภทการใช้ซ้ำ

อีกทางเลือกหนึ่งที่ฉันต้องการปิดใช้งานประเภทการใช้ซ้ำคือการเพิ่มการอ้างอิงบริการจากโปรเจ็กต์ Class Library ที่สร้างขึ้นโดยเฉพาะเพื่อจุดประสงค์นั้น สิ่งหนึ่งที่ควรทราบคือคัดลอกการกำหนดค่าที่เกี่ยวข้องกับบริการทั้งหมดจาก app.config ของไลบรารีคลาสไปยังไฟล์กำหนดค่าของโครงการเริ่มต้น

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


แปลก. ฉันเปลี่ยนการเชื่อมโยงจาก HttpBinding เป็น NetNamedPipeBinding (เพิ่มจุดสิ้นสุด mex ด้วย) และเข้ารหัสสิ่งนี้ในแอสเซมบลีไคลเอ็นต์ A ฉันสร้างคลาส libary B ใหม่ซึ่งอ้างอิงถึงบริการ WCF ของฉัน จากนั้นฉันเพิ่ม B เป็นข้อมูลอ้างอิงถึง A และทุกอย่างก็ทำงานได้อย่างน่าอัศจรรย์อีกครั้ง ที่แปลกมาก. ขอบคุณสำหรับการแก้ปัญหา
citronas

3

http://uliasz.com/2011/06/wcf-custom-tool-error-failed-to-generate-code-for-the-service-reference/#comment-1647

ขอบคุณบทความด้านบน

ในกรณีของฉันฉันมีปัญหากับโปรเจ็กต์ WPF ของฉันใน VS.Net 2008 หลังจากอ่านบทความนี้แล้วฉันตระหนักว่าแอสเซมบลีที่ใช้ในบริการเว็บเป็นแอสเซมบลีเวอร์ชันอื่นที่ใช้กับไคลเอนต์

ใช้งานได้ดีหลังจากอัปเดตแอสเซมบลีบนไคลเอนต์


1

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

ทั้งหมดที่ฉันสามารถพูดได้ก็คือดูเหมือนว่าจะมีสคีมาที่ขาดหายไปใน WSDL (โดยมีเนมสเปซเป้าหมาย "http://service.ebms.edi.cecid.hku.hk/") ฉันทราบเกี่ยวกับปัญหาและการจัดการสคีมาที่แตกต่างกันเมื่อคำแนะนำรวมถูกละเว้น

โดยทั่วไปฉันพบว่าการใช้บริการเว็บของ Microsoft ค่อนข้างดีดังนั้นฉันคิดว่าบริการเว็บกำลังส่ง WSDL ที่หลบเลี่ยงกลับมา


ขอบคุณ Aliostad ฉันจะพยายามแบ่งปัน WSDL เมื่อฉันเข้าจากที่ทำงาน
jheppinstall

0

ฉันได้รับข้อผิดพลาดเดียวกันใน Silverlight 5 (VS2012)

คุณยังสามารถลบการอ้างอิงถึง:

  • System.ServiceModel.DomainServices.Client
  • System.ServiceModel.DomainServices.Client.Web

หลังจากคุณอัปเดตการอ้างอิงบริการแล้วอย่าลืมเพิ่มกลับเข้าไป


0

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

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


0

ประสบปัญหาเดียวกันแก้ไขโดยเรียกใช้ Visual Studio ในโหมดผู้ดูแลระบบ


0

ฉันได้พบปัญหานี้เมื่ออัพเกรดเป็นทางออกที่ VS2010 WCF + Silverlight ใน VS2015 มืออาชีพ นอกจากการอัปเกรดจาก Silverlight 4 เป็น Silverlight 5 โดยอัตโนมัติแล้วค่าช่องทำเครื่องหมายการใช้ซ้ำการอ้างอิงบริการก็เปลี่ยนไปและการสร้างล้มเหลว


0

"ประเภทการใช้ซ้ำ" ไม่ใช่ปัญหาเสมอไปเมื่อเกิดข้อผิดพลาดนี้

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


0

หากคุณต้องการแก้ไขสิ่งนี้โดยไม่ต้องยกเลิกการเลือกช่องทำเครื่องหมายใช้ซ้ำแอสเซมบลีนี่คือสิ่งที่ใช้ได้ผลสำหรับฉัน:

  • ลบแอสเซมบลีที่อ้างอิงที่คุณต้องการใช้ซ้ำ
  • ลบโฟลเดอร์ bin ทั้งหมดของโครงการ
  • อัปเดตข้อมูลอ้างอิงบริการ
    • เก็บ "ประเภทการใช้ซ้ำในแอสเซมบลีอ้างอิงที่ระบุ"
  • เพิ่มการอ้างอิงไปยังแอสเซมบลีอีกครั้งเพื่อแก้ไขข้อผิดพลาด
  • อัปเดตข้อมูลอ้างอิงบริการอีกครั้ง


-1

ฉันมีปัญหานี้เมื่อพยายามอัปเดตการอ้างอิงบริการของฉัน (ข้อผิดพลาดจะปรากฏขึ้นเมื่อเพิ่มการอ้างอิงบริการเท่านั้น) แต่ไม่ต้องการลบช่องทำเครื่องหมายการใช้ซ้ำของแอสเซมบลี

สิ่งที่ได้ผลสำหรับฉันมีดังต่อไปนี้:

  • ลบแอสเซมบลีที่อ้างอิงซึ่งฉันต้องการใช้ซ้ำ
  • อัปเดตข้อมูลอ้างอิงบริการ
  • เก็บ "ประเภทการใช้ซ้ำในแอสเซมบลีอ้างอิงที่ระบุ"
  • ไม่ต้องสนใจข้อผิดพลาดเนื่องจากไม่มีข้อมูลอ้างอิง!
  • เพิ่มการอ้างอิงไปยังแอสเซมบลีอีกครั้งเพื่อแก้ไขข้อผิดพลาด
  • อัปเดตข้อมูลอ้างอิงบริการอีกครั้ง

Voila ตอนนี้มันอัปเดตจริงและไม่พยายามลบรหัสที่ฉันสร้างขึ้นทั้งหมดอีกต่อไป

ฉันเกือบจะพร้อมที่จะเลิกใช้คุณสมบัติประเภทการใช้ซ้ำ ...

แก้ไข:ตรวจสอบให้แน่ใจว่า build config เป็น AnyCPU หรือ x86 เนื่องจาก svcutil เป็นบั๊กกี้ด้วย x64

ถึงผู้โหวตลงคะแนน: ขออภัยหากไม่ได้ผลสำหรับคุณฉันไม่รู้ด้วยซ้ำว่าทำไมมันถึงได้ผลสำหรับฉัน แต่มันก็ทำได้ ฉันอาจจะทำอย่างอื่นในตอนนั้นที่แก้ปัญหาได้ แต่ตอนนี้ยังไม่รู้

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