ข้อผิดพลาด WCF นี้หมายความว่าอย่างไร:“ คำเตือนเครื่องมือที่กำหนดเอง: ไม่สามารถนำเข้า wsdl: portType”


85

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

ทุกอย่างทำงานได้ดี - จนกระทั่งฉันต้องการอัปเดตข้อมูลอ้างอิงบริการของฉัน มันล้มเหลวในที่สุดฉันจึงย้อนกลับและลองใหม่ แต่มันก็ล้มเหลวในที่สุด! ดังนั้น - การอัปเดตการอ้างอิงบริการล้มเหลวโดยไม่ต้องทำการเปลี่ยนแปลงใด ๆ ทำไม?!

ข้อผิดพลาดที่ฉันได้รับคือข้อผิดพลาดนี้:

Custom tool error: Failed to generate code for the service reference 
'MyServiceReference'.  Please check other error and warning messages for details.   

คำเตือนให้ข้อมูลเพิ่มเติม:

Custom tool warning: Cannot import wsdl:portType
Detail: An exception was thrown while running a WSDL import extension: 
System.ServiceModel.Description.DataContractSerializerMessageContractImporter
Error: List of referenced types contains more than one type with data contract name 'Patient' in  
namespace 'http://schemas.datacontract.org/2004/07/MyApp.Model'. Need to exclude all but one of the 
following types. Only matching types can be valid references: 
"MyApp.Dashboard.MyServiceReference.Patient, Medski.Dashboard, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" (matching)
"MyApp.Model.Patient, MyApp.Model, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" (matching)
XPath to Error Source: //wsdl:definitions[@targetNamespace='http://tempuri.org/']/wsdl:portType[@name='ISomeService']

มีคำเตือนที่คล้ายกันสองคำเช่นกัน:

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://tempuri.org/']/wsdl:portType[@name='ISomeService']
XPath to Error Source: //wsdl:definitions[@targetNamespace='http://tempuri.org/']/wsdl:binding[@name='WSHttpBinding_ISomeService']  

และเช่นเดียวกันสำหรับ:

Custom tool warning: Cannot import wsdl:port .. 

ฉันพบว่าทั้งหมดนี้สับสน .. ฉันไม่มีคลาสผู้ป่วยในแดชบอร์ดฝั่งไคลเอ็นต์ยกเว้นคลาสที่ฉันได้รับจากการอ้างอิงบริการ แล้วมันหมายความว่าอย่างไร? แล้วทำไมจู่ๆมันถึงแสดง? จำไว้ว่า: ฉันไม่ได้เปลี่ยนแปลงอะไรเลย!

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


โอเคมีคำอธิบายสั้น ๆ เกี่ยวกับmsdn ( msdn.microsoft.com/en-us/library/bb628653.aspx ) แต่ใครมีคำอธิบายที่ดีกว่านี้? สิ่งนี้อ้างถึง DataContract ที่ฉันตั้งค่าได้อย่างไร
stiank81

คำตอบ:


37

เมื่อคุณเพิ่มการอ้างอิงบริการคุณสามารถจัดการประเภทที่ใช้โดยบริการได้สองวิธี:

  • ชนิดจะถูกเก็บไว้ใน dll และ dll นั้นอ้างอิงจากทั้งไคลเอนต์และแอ็พพลิเคชันเซิร์ฟเวอร์
  • ชนิดไม่ได้อยู่ใน dll ที่ไคลเอนต์อ้างอิง ในกรณีนี้เครื่องมือที่สร้างการอ้างอิงบริการจะสร้างประเภทในไฟล์ references.cs

มีหลายสิ่งที่อาจผิดพลาดได้ เราพบว่าหากเครื่องมือขัดข้องบางครั้งอาจเร็วกว่าที่จะลบการอ้างอิงบริการและเริ่มใหม่อีกครั้ง

เราได้หยุดใช้การอ้างอิงบริการ สำหรับโครงการที่เรามีการควบคุมไคลเอนต์และบริการเราใช้วิธีการที่อธิบายไว้ในscreencastนี้


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

มีใครบ้างที่สามารถเขียนบริการเว็บด้วยมือเมื่อคุณใช้ PollingDuplex Binding กับ Silverlight 5?
Richard B

157

ฉันพบคำตอบของฉันที่นี่: http://www.lukepuplett.com/2010/07/note-to-self-don-let-wcf-svcutil-reuse.html

เรื่องยาวสั้น: ฉันไม่ จำกัดประเภทการใช้ซ้ำในการประกอบการอ้างอิงจากเมนูขั้นสูง


ฉันไม่รู้ว่าเรื่องนี้สำคัญหรือไม่ แต่ฉันไม่ได้ใช้ MVC แต่เป็นแบบฟอร์มเว็บ


2
ต้องรีสตาร์ท VS 2012 ด้วย
George Filippakos

สนใจดู แต่ลิงค์ตายแล้วโปรดแชร์ถ้าคุณมีที่อื่น
คริส

1
ทำงานในโครงการ MVC 3 ภายใต้ VS2013 (ไม่ต้องรีสตาร์ท)
Pawel Krakowiak

5
+1 - เพียงเพื่อการอ้างอิง: หากต้องการทำการเปลี่ยนแปลงนี้ให้คลิกขวาที่ข้อมูลอ้างอิงบริการในโครงการที่ใช้งานและเลือก 'กำหนดค่าการอ้างอิงบริการ ... '
GrandMasterFlush

2
ไม่มีอะไรดีไปกว่า "เรื่องยาวสั้น" :)
รอน

10

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

ชั้นเรียนของฉันที่ไม่สามารถนำเข้าได้มีคุณสมบัติประเภท cutom enum คุณสมบัตินี้ถูกทำเครื่องหมายเป็น DataMember และ Enum ถูกทำเครื่องหมายเป็น DataContract ด้วย ทุกอย่างเรียบร้อยดี ฉันลืมทำเครื่องหมายสมาชิก enum ทุกคนเป็น EnumMember

ดังนั้นฉันจึงเปลี่ยนไป

[DataContract]
public enum SortMethodType
{
    Default = 0,
    Popularity = 1,
    ReleaseDate = 2,
    PublishedDate = 3,
    TranslatedTitle = 4,
    OriginalTitle = 5,
    UserRating = 6,
    Duration = 7
}

สำหรับสิ่งนี้:

[DataContract]
public enum SortMethodType
{
    [EnumMember]
    Default = 0,
    [EnumMember]
    Popularity = 1,
    [EnumMember]
    ReleaseDate = 2,
    [EnumMember]
    PublishedDate = 3,
    [EnumMember]
    TranslatedTitle = 4,
    [EnumMember]
    OriginalTitle = 5,
    [EnumMember]
    UserRating = 6,
    [EnumMember]
    Duration = 7
}

และในที่สุดมันก็ได้ผล!


8

ไปที่คุณสมบัติขั้นสูงในขณะที่เพิ่มการอ้างอิงและลบ "System.Window.Browser" ออกจากรายการตรวจสอบจะช่วยแก้ปัญหาได้


ขอบคุณ! ไม่ใช้การอ้างอิงบริการอีกต่อไป - ทำตามวิธีการด้วยตนเองที่อธิบายไว้ใน screencast จากคำตอบโดย @Shiraz แต่ก็น่ารู้อยู่ดี!
stiank81

8

อาจฟังดูแปลก แต่ฉันได้รับการแก้ไขโดยการลบการอ้างอิงจากนั้นปิด Visual Studio แล้วเปิดใหม่อีกครั้งและในที่สุดก็เพิ่มการอ้างอิงอีกครั้ง

ฉันคิดว่าต้องรีสตาร์ทเครื่องมือที่กำหนดเองหรืออะไรบางอย่าง


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

4

ฉันพบข้อผิดพลาดนี้ตลอดเวลาในขณะที่มันทำงานบนเครื่องของนักพัฒนาอื่น แม้ว่าฉันจะเป็นผู้ดูแลระบบแบบเต็มทุกที่ในเครื่องเสมือนของฉันฉันก็ลองปิด Visual Studio แล้วเปิดใหม่ด้วย 'Run As Administrator' และมันก็ทำงานได้อย่างน่าอัศจรรย์

โชคดี.


2

ฉันได้รับคำเตือนหลังจากอัปเกรดโซลูชันจาก Visual Studio (VS) 2010 เป็น 2013 และเปลี่ยน. NET Framework ของแต่ละโครงการจาก 4 เป็น 4.5.1 ฉันปิด VS แล้วเปิดใหม่และคำเตือนก็หายไป


สิ่งนี้ช่วยฉันได้ แต่ฉันเปลี่ยนจาก. NET 4.5.2 เป็น 4.6 Gaa!
Jimenemex

1

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

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

หวังว่ามันจะช่วยคนอื่น


0

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


0

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

ฉันใช้ Silverlight 5 และพยายามลบและสร้างข้อมูลอ้างอิงใหม่หลายครั้ง reference.csไฟล์เพียงแค่ขึ้นมาอย่างสมบูรณ์ว่างในแต่ละครั้งและจะได้รับอย่างแท้จริงปีนับตั้งแต่ที่ผมสร้างมันขึ้นมาเพื่อพยายามที่จะคิดออกว่ามีการเปลี่ยนแปลงในการให้บริการเป็นไปไม่ได้

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

คำเตือน 2 คำเตือนเครื่องมือที่กำหนดเอง: ไม่สามารถนำเข้า wsdl: portType Detail: มีข้อยกเว้นเกิดขึ้นขณะเรียกใช้ส่วนขยายการนำเข้า WSDL: System.ServiceModel.Description.DataContractSerializerMessageContractImporter Error: ไม่สามารถโหลดไฟล์หรือแอสเซมบลี 'System.Xml, Version = 2.0.5.0, วัฒนธรรม = เป็นกลาง PublicKeyToken = 7cec85d7bea7798e 'หรือการพึ่งพาอย่างใดอย่างหนึ่ง ระบบไม่พบแฟ้มที่ระบุ. XPath ถึง Error Source: // wsdl: definitions [@targetNamespace = ''] / wsdl: port Type [@ name = 'IShoppingCart']


0

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


0

ฉันพบข้อผิดพลาดเดียวกัน ฉันพยายามอยู่เกือบวันเพื่อพยายามค้นหาว่าเกิดอะไรขึ้น เบาะแสสำหรับฉันคือคำเตือนที่ VS ขว้างปา มันพยายามทำแผนที่บางอย่างกับ Yahoo.Yui.Compressor.dll ซึ่งเป็นไลบรารีที่ฉันได้เพิ่มและลบ (เพราะฉันตัดสินใจที่จะไม่ใช้มัน) เมื่อสองสามวันก่อน มันน่าตกใจเพราะห้องสมุดไม่ได้อยู่ที่นั่น แต่ก็พยายามอ้างอิง

สุดท้ายฉันกู้คืน dll นี้จากถังขยะจากนั้นฉันสามารถอัปเดตการอ้างอิงบริการของฉันได้สำเร็จ


0

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

ฉันมีบริการ WCF สองรายการและแอปพลิเคชันไคลเอนต์สองรายการที่พูดคุยผ่านการอ้างอิงบริการ ฉันอัปเดตแพ็คเกจ nuget ทั้งสองด้านและพยายามอัปเดตการอ้างอิงบริการและได้รับข้อผิดพลาดนี้

การลบไม่ได้ช่วยอะไร ไม่ต้องการเลือก "ใช้ซ้ำแอสเซมบลี" เพราะฉันต้องใช้ซ้ำนั่นคือประเด็นทั้งหมด

ท้ายที่สุดมีสองประเด็นที่แยกจากกัน:

1) ปัญหาแรกฉันเชื่อว่าเป็นปัญหาการแคช Visual Studio ฉันตรวจสอบข้อมูลอ้างอิงทั้งหมดอย่างพิถีพิถันและไม่พบปัญหา แต่ยังมีรายงานว่าไม่พบไฟล์เวอร์ชันก่อนหน้า ฉันถอนการติดตั้งแพ็คเกจ nuget ทั้งหมดรีสตาร์ทวิชวลสตูดิโอและติดตั้งใหม่ การอัปเดตการอ้างอิงบริการใช้งานได้

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

แพคเกจ Foo v1 แถบอ้างอิง v1.0 เป็นไปได้ที่จะอัปเดต Foo และ Bar เป็น v2 อย่างอิสระโดยไม่ต้องอัปเดตข้อมูลอ้างอิง หากคุณติดตั้งทั้ง Foo และ Bar v2 เครื่องมืออ้างอิงบริการจะสแกน Foo v2 ดูการอ้างอิงถึง Bar v1 และล้มเหลวเนื่องจากไม่พบเวอร์ชันที่เก่ากว่า สิ่งนี้จะรายงานอย่างถูกต้องก็ต่อเมื่อคุณอัปเดตหมายเลขเวอร์ชันของ dll สำหรับทุกแพ็คเกจ Visual Studio และ MSBuild จะไม่มีปัญหาในการสร้างแอปพลิเคชัน แต่การอ้างอิงบริการจะมีช่วงเวลาที่เลวร้ายในการพยายามแก้ไขทุกอย่าง

ฉันหวังว่านี่จะช่วยใครบางคนได้

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