บางครั้งการเพิ่มการอ้างอิงบริการ WCF จะสร้างการอ้างอิงที่ว่างเปล่าและฉันไม่สามารถอ้างอิงบริการได้ทุกที่ในโครงการ
มีใครพบกับสิ่งนี้หรือไม่?
บางครั้งการเพิ่มการอ้างอิงบริการ WCF จะสร้างการอ้างอิงที่ว่างเปล่าและฉันไม่สามารถอ้างอิงบริการได้ทุกที่ในโครงการ
มีใครพบกับสิ่งนี้หรือไม่?
คำตอบ:
โดยทั่วไปผมพบว่ามันเป็นปัญหารหัส-Gen และมากที่สุดเป็นเพราะฉันมีชื่อที่ขัดแย้งกันซึ่งไม่สามารถแก้ไขได้
หากคุณคลิกขวาที่ข้อมูลอ้างอิงบริการของคุณแล้วคลิกกำหนดค่าและยกเลิกการเลือก "ประเภทการใช้ซ้ำในแอสเซมบลีที่อ้างอิง"อาจเป็นไปได้ว่าปัญหาจะหายไป
หากคุณใช้คุณสมบัติบางอย่างของคุณสมบัตินี้คุณอาจต้องตรวจสอบให้แน่ใจว่าชื่อของคุณถูกลบทิ้ง
เนื่องจากคำตอบที่ได้รับการยอมรับชี้ให้เห็นปัญหาการอ้างอิงประเภทเมื่อนำมาใช้ซ้ำประเภทอาจเป็นผู้ร้าย ฉันพบเมื่อคุณไม่สามารถระบุปัญหาได้อย่างง่ายดายจากนั้นใช้บรรทัดคำสั่ง svcutil.exe จะช่วยให้คุณเปิดเผยปัญหาพื้นฐาน (ตามที่ John Saunders ชี้ให้เห็น)
เป็นการปรับปรุงที่นี่เป็นตัวอย่างรวดเร็วของการใช้ svcutil
svcutil /t:code https://secure.myserver.com/services/MyService.svc /d:test /r:"C:\MyCode\MyAssembly\bin\debug\MyAssembly.dll"
ที่ไหน:
การอ้างอิงบรรทัดคำสั่งแบบเต็ม svcutil ที่นี่: http://msdn.microsoft.com/en-us/library/aa347733.aspx
เมื่อคุณเรียกใช้ svcutil คุณควรเห็นข้อยกเว้นที่เกิดจากการนำเข้า คุณอาจได้รับข้อความประเภทนี้เกี่ยวกับประเภทใดประเภทหนึ่งของคุณ: "ประเภทอ้างอิงไม่สามารถใช้งานได้เนื่องจากไม่ตรงกับ DataContract ที่นำเข้า"
สิ่งนี้สามารถระบุได้ง่ายๆว่ามีความแตกต่างในประเภทใดประเภทหนึ่งในชุดประกอบที่อ้างอิงจากสิ่งที่สร้างขึ้นใน DataContract สำหรับบริการ ในกรณีของฉันบริการที่ฉันกำลังนำเข้ามีประเภทที่ใหม่กว่าอัปเดตจากสิ่งที่ฉันมีในแอสเซมบลีที่แชร์ สิ่งนี้ไม่ชัดเจนเนื่องจากประเภทที่กล่าวถึงในข้อยกเว้นนั้นเหมือนกัน สิ่งที่แตกต่างคือหนึ่งในประเภทคอมเพล็กซ์ซ้อนกันที่ใช้โดยประเภท
มีสถานการณ์ที่ซับซ้อนมากขึ้นอื่น ๆ ที่อาจทำให้เกิดข้อยกเว้นประเภทนี้และทำให้เกิดการอ้างอิงที่ว่างเปล่า นี่คือตัวอย่างหนึ่ง
หากคุณประสบปัญหานี้และคุณไม่ได้ใช้งานประเภททั่วไปในสัญญาข้อมูลของคุณและไม่ได้ใช้งาน IsReference = true ฉันขอแนะนำให้คุณตรวจสอบเพื่อยืนยันว่าประเภทที่ใช้ร่วมกันของคุณเหมือนกันกับลูกค้าและเซิร์ฟเวอร์ของคุณ มิฉะนั้นคุณอาจประสบปัญหานี้
เมื่อสิ่งนี้เกิดขึ้นให้ดูในหน้าต่างข้อผิดพลาดและหน้าต่างผลลัพธ์เพื่อดูว่ามีข้อความผิดพลาดหรือไม่ หากวิธีนี้ไม่ได้ผลให้ลองเรียกใช้svcutil.exe
ด้วยตนเองและดูว่ามีข้อความแสดงข้อผิดพลาดหรือไม่
ฉันทุบตีหัวของฉันตลอดทั้งวันด้วยปัญหาที่แน่นอนนี้ ฉันเพิ่งแก้ไขมัน นี่คือวิธี ...
บริการมีการเรียกใช้ผ่าน SSL (คือมันจะอยู่ที่https://mydomain.com/MyService.svc )
การเพิ่มการอ้างอิงบริการไปยังบริการ WCF บนเซิร์ฟเวอร์การพัฒนานั้นใช้ได้ดี
การปรับใช้บิลด์ของบริการ WCF ที่แน่นอนบนเซิร์ฟเวอร์การผลิตจริงจากนั้นสลับไปยังแอปพลิเคชันไคลเอนต์และกำหนดค่าการอ้างอิงบริการให้ชี้ไปที่บริการสดที่แสดงไม่มีข้อผิดพลาด แต่แอปจะไม่สร้าง: ปรากฎว่า ไฟล์ Reference.cs ว่างเปล่าอย่างสมบูรณ์! การอัปเดตข้อมูลอ้างอิงบริการไม่มีความแตกต่าง การทำความสะอาดโซลูชันไม่ได้ช่วย การเริ่มต้น VS2010 ไม่ได้สร้างความแตกต่าง การสร้างโซลูชันเปล่าใหม่เริ่มโครงการคอนโซลและเพิ่มการอ้างอิงบริการไปยังบริการสดที่มีปัญหาเดียวกันทั้งหมด
ฉันไม่คิดว่ามันเป็นเพราะประเภทที่ขัดแย้งหรืออะไรก็ตาม แต่สิ่งที่ heck - ฉันกำหนดค่าการอ้างอิงบริการ WCF ใหม่โดยการยกเลิกการเลือก "ใช้ซ้ำประเภทในแอสเซมบลีที่อ้างอิงทั้งหมด" ไม่มีความสุข ฉันใส่เครื่องหมายถูกกลับ
ขั้นตอนต่อไปคือลองsvcutilบน URL อ้างอิงเพื่อดูว่าจะช่วยเปิดเผยปัญหาได้หรือไม่ นี่คือคำสั่ง:
svcutil /t:code https://mydomain.com/MyService.svc /d:D:\test
สิ่งนี้ผลิตต่อไปนี้:
Microsoft (R) Service Model Metadata Tool
[Microsoft (R) Windows (R) Communication Foundation, Version 4.0.30319.1]
Copyright (c) Microsoft Corporation. All rights reserved.
Attempting to download metadata from 'https://mydomain.com/MyService.svc' using WS-Metadata Exchange or DISCO.
Error: Cannot import wsdl:portType
Detail: An exception was thrown while running a WSDL import extension: System.ServiceModel.Description.DataContractSerializerMessageContractImporter
Error: Schema with target namespace 'http://mynamespace.com//' could not be found.
XPath to Error Source: //wsdl:definitions[@targetNamespace='http://mynamespace.com//']/wsdl:portType[@name='IMyService']
Error: 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://mynamespace.com//']/wsdl:portType[@name='IMyService']
XPath to Error Source: //wsdl:definitions[@targetNamespace='http://tempuri.org/']/wsdl:binding[@name='WSHttpBinding_IMyService']
Error: 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://tempuri.org/']/wsdl:binding[@name='WSHttpBinding_IMyService']
XPath to Error Source: //wsdl:definitions[@targetNamespace='http://tempuri.org/']/wsdl:service[@name='MyService']/wsdl:port[@name='WSHttpBinding_IMyService']
Generating files...
Warning: No code was generated.
If you were trying to generate a client, this could be because the metadata documents did not contain any valid contracts or services
or because all contracts/services were discovered to exist in /reference assemblies. Verify that you passed all the metadata documents to the tool.
Warning: If you would like to generate data contracts from schemas make sure to use the /dataContractOnly option.
นั่นทำให้ฉันนิ่งงันอย่างสมบูรณ์ แม้ว่า googling หนักและข้ามค่อนข้างมากและพิจารณาอาชีพในฐานะคนขับรถบัสอีกครั้งในที่สุดฉันก็คิดว่าทำไมมันถึงทำงานได้ดีบนกล่องพัฒนา อาจเป็นปัญหาการกำหนดค่า IIS หรือไม่
ฉัน remoting พร้อมกันลงในทั้งกล่องพัฒนาและกล่องถ่ายทอดสดและในแต่ละครั้งที่ฉันเปิดโปรแกรม IIS Manager (เรียกใช้ IIS 7.5) ต่อไปฉันผ่านการตั้งค่าแต่ละครั้งในแต่ละกล่องเปรียบเทียบค่าในแต่ละเซิร์ฟเวอร์
และมีปัญหา: ภายใต้ "การตั้งค่า SSL" สำหรับไซต์ตรวจสอบให้แน่ใจว่าได้เลือก "ต้องใช้ SSL" และตรวจสอบปุ่มตัวเลือกใบรับรองลูกค้าสำหรับ "ยอมรับ" แก้ไขปัญหาแล้ว!
ฉันพบสิ่งนี้เกิดขึ้นเป็นปกติเมื่อใดก็ตามที่ฉันเพิ่มการอ้างอิงเอาออกแล้วเพิ่มบริการอีกครั้งด้วยชื่อเดียวกัน ความขัดแย้งประเภทที่เกิดจากไฟล์เก่าที่เหลืออยู่ที่ไหนสักแห่งที่ Visual Studio ยังคงเห็น สิ่งที่ฉันต้องทำเพื่อแก้ไขคือทำความสะอาดก่อนเพิ่มการอ้างอิงใหม่
หวังว่านี่จะช่วยได้
ฉันมีปัญหานี้กับ Silverlight 5 ที่อัปเกรดจากรุ่นก่อนหน้า
แม้แต่การเพิ่มการอ้างอิงบริการอีกครั้งก็ยังให้ฉัน Reference.cs ที่ว่างเปล่า
ฉันสิ้นสุดต้องสร้างโครงการใหม่และสร้างการอ้างอิงบริการอีกครั้ง นี่เป็นสิ่งที่ควรลองถ้าคุณใช้เวลามากกว่านี้ไปครึ่งชั่วโมง แม้ว่าคุณจะมุ่งมั่นที่จะแก้ไขโครงการดั้งเดิมคุณอาจต้องการลองทำสิ่งนี้เพื่อดูว่าเกิดอะไรขึ้นจากนั้นลองย้อนกลับเพื่อแก้ไขปัญหา
ฉันไม่เคยคิดออกว่าปัญหาคืออะไร - แต่อาจมีบางอย่างในไฟล์. csproj ไม่ได้รับการอัพเกรดหรือการตั้งค่าบางอย่างผิดพลาด
System.Xml.Linq
- ดังนั้นตรวจสอบรุ่นของ DLLs ของคุณถ้าคุณได้เปลี่ยนรุ่น
หากคุณเพิ่งเพิ่มคอลเล็กชันในโครงการของคุณเมื่อสิ่งนี้เริ่มเกิดขึ้นปัญหาอาจเกิดจากการรวบรวมสองชุดที่มีแอตทริบิวต์CollectionDataContractเดียวกัน:
[CollectionDataContract(Name="AItems", ItemName="A")]
public class CollectionA : List<A> { }
[CollectionDataContract(Name="AItems", ItemName="A")] // Wrong
public class CollectionB : List<B> { }
ฉันคงผิดพลาดโดยการกวาดผ่านโครงการของฉันและสร้างความมั่นใจว่าทุกชื่อและItemNameแอตทริบิวต์เป็นเอกลักษณ์:
[CollectionDataContract(Name="AItems", ItemName="A")]
public class CollectionA : List<A> { }
[CollectionDataContract(Name="BItems", ItemName="B")] // Corrected
public class CollectionB : List<B> { }
จากนั้นฉันรีเฟรชข้อมูลอ้างอิงบริการและทุกอย่างทำงานได้อีกครั้ง
ปัญหาของฉันคือฉันทิ้ง " mex " ไว้ที่ส่วนท้ายของลิงก์บริการเว็บของฉัน
แทนที่จะเป็น " http://yeagertech.com/yeagerte/YeagerTechWcfService.YeagerTechWcfService.svc/mex "
ใช้ " http://yeagertech.com/yeagerte/YeagerTechWcfService.YeagerTechWcfService.svc "
เทคนิคที่เหมาะกับฉันในกรณีของฉันหลังจากอ่านคำตอบเหล่านี้เพื่อประโยชน์ไม่ได้เป็นเพียงเพื่อแสดงความคิดเห็นทั้งหมดของสัญญาของฉันและบิต uncomment จนกว่ามันจะไม่ทำงานอีกต่อไปในการค้นหาแบบไบนารี นั่นทำให้แคบลงเล็กน้อยของรหัสที่ละเมิด
จากนั้นคุณต้องเดาว่าเกิดอะไรขึ้นกับรหัสนั้น
ข้อเสนอแนะข้อผิดพลาดบางอย่างในเครื่องมือจะช่วยแน่นอน
ฉันกำลังเขียนสัญญาบริการเว็บ ฉันมีตัวยึด enum โดยไม่มีสมาชิก ไม่เป็นไร. แต่ถ้าฉันใช้มันในทรัพย์สินของคลาสอื่นและใช้สัญญา dll ซ้ำบนไคลเอนต์ codegen จะระเบิดโดยไม่มีข้อผิดพลาด ใช้ svcutil.exe ไม่ได้ช่วยมันก็แค่ล้มเหลวในการส่งออกไฟล์ cs โดยไม่พูดถึงเหตุผล
ต่อไปนี้ไม่ได้อยู่ในรายการที่นี่และเป็นวิธีแก้ปัญหาที่ฉันนำมาใช้ (SvcUtils มีประโยชน์ในการดูข้อความแสดงข้อผิดพลาดอย่างไรก็ตามข้อผิดพลาดที่ฉันได้รับคือwrapper type message cannot be projected as a data contract type since it has multiple namespaces
ความหมายฉันปฏิบัติตามลูกค้าเป้าหมายนี้และเรียนรู้wsdl.exe
ผ่านโพสต์นี้ )
ในกรณีของฉันเพียงแค่เรียกใช้ wsdl [ my-asmx-service-address ] สร้าง.cs
ไฟล์ที่ไม่มีปัญหาซึ่งฉันรวมอยู่ในโครงการของฉันและเริ่มใช้บริการ
เป็น @dblood ชี้ให้เห็นความเจ็บปวดหลักอยู่ใน DataContractSerializer ที่ไม่ได้ใช้ชนิดนั้นอีกครั้งอย่างถูกต้อง มีคำตอบอยู่แล้วที่นี่ดังนั้นฉันจะเริ่มด้วยการเพิ่มผู้เชี่ยวชาญและข้อเสียเกี่ยวกับสิ่งเหล่านี้:
โชคดีถ้าคุณเป็นผู้ควบคุมการให้บริการของคุณมีวิธีแก้ปัญหาง่ายๆที่แก้ปัญหาเหล่านี้ทั้งหมด ซึ่งหมายความว่าคุณยังคงสามารถใช้อินเตอร์เฟสบริการข้าม DLL ได้ซึ่งเป็น IMO ที่ต้องมีเพื่อการแก้ปัญหาที่เหมาะสม นี่คือวิธีการแก้ปัญหาการทำงาน:
ใช้ DLL เดียวกันเพื่อสร้างไคลเอนต์โดยใช้วิธีการที่คุณชื่นชอบ ตัวอย่างเช่น (IMyInterface เป็นอินเทอร์เฟซสัญญาบริการ):
var httpBinding = new BasicHttpBinding();
var identity = new DnsEndpointIdentity("");
var address = new EndpointAddress(url, identity, new AddressHeaderCollection());
var channel = new ChannelFactory<IMyInterface>(httpBinding, address);
return channel.CreateChannel();
กล่าวอีกนัยหนึ่ง: อย่าใช้ฟังก์ชั่น 'เพิ่มบริการอ้างอิง'แต่บังคับให้ WCF ใช้ประเภทบริการ (ถูกต้อง) โดยข้ามการสร้างพร็อกซี ท้ายที่สุดคุณมีคลาสเหล่านี้แล้ว
ข้อดี:
จุดด้อย:
ฉันยังมีปัญหาของการอ้างอิงบริการที่ใช้งานไม่ได้เมื่อทำงานกับการอ้างอิงโครงการทั้งสองด้าน (โครงการบริการและโครงการที่มีการอ้างอิงถึงบริการ) หาก. dll ของโครงการที่อ้างถึงนั้นถูกเรียกว่า "Contoso.Development.Common" แต่ชื่อโครงการนั้นย่อมาจาก "Common" แต่โครงการที่อ้างอิงถึงโครงการนี้ก็มีชื่อว่า "Common" บริการคาดว่าจะมีการอ้างอิงถึง "Contoso.Development.Common" สำหรับการแก้ไขชั้นเรียน (หากเปิดใช้งานตัวเลือกนี้ในตัวเลือกการอ้างอิงบริการ)
ดังนั้นด้วย explorer ฉันเปิดโฟลเดอร์ของโครงการที่อ้างอิงบริการและโครงการ "ทั่วไป" มีฉันแก้ไขไฟล์โครงการ VS (.csproj) ด้วย notepad ค้นหาชื่อของโครงการอ้างอิง (ซึ่งคือ "Common.csproj" ในตัวอย่างนี้) และคุณจะพบรายการกำหนดค่าที่แสดงถึงการอ้างอิงโครงการอย่างรวดเร็ว
ฉันเปลี่ยน
<ProjectReference Include="..\Common\Common.csproj">
<Project>{C90AAD45-6857-4F83-BD1D-4772ED50D44C}</Project>
<Name>Common</Name>
</ProjectReference>
ถึง
<ProjectReference Include="..\Common\Common.csproj">
<Project>{C90AAD45-6857-4F83-BD1D-4772ED50D44C}</Project>
<Name>Contoso.Development.Common</Name>
</ProjectReference>
สิ่งที่สำคัญคือการเปลี่ยนชื่อของการอ้างอิงถึงชื่อของ dll ที่อ้างอิงโครงการได้เป็นเอาท์พุท
จากนั้นสลับกลับไปเป็น VS ที่นั่นคุณจะถูกขอให้โหลดโครงการใหม่เนื่องจากมีการแก้ไขนอก VS คลิกที่ปุ่มโหลดซ้ำ
หลังจากทำเช่นนั้นการเพิ่มและไม่อัพเดทการอ้างอิงบริการทำงานได้ตามที่คาดไว้
หวังว่านี่จะช่วยคนอื่นด้วย
ขอแสดงความนับถือ MH
ฉันประสบปัญหาคล้ายกันเมื่อวานนี้ในระหว่างการพัฒนา ฉันพบว่าฉันใช้เนมสเปซเดียวกันในสัญญาต่างรุ่นสองรุ่น
เรามีสัญญา 2 รุ่นเช่น version4 และ version5 ฉันได้คัดลอกสัญญาทั้งหมดจาก version4 และเปลี่ยนชื่อ namespace ทั้งหมดจาก version4 เป็น version5 ในขณะที่ทำสิ่งนี้ฉันลืมเปลี่ยนชื่อเนมสเปซจาก v4 เป็น v5 ในไฟล์ใดไฟล์หนึ่ง เนื่องจากความขัดแย้งของเนมสเปซไฟล์ Reference.cs ว่างเปล่า
ปัญหานี้แก้ไขได้ยากเนื่องจากคุณไม่ได้รับข้อความแสดงข้อผิดพลาดใด ๆ ในขณะที่สร้างการอ้างอิงบริการ เพื่อระบุปัญหานี้ฉันจะตรวจสอบไฟล์ใหม่ทั้งหมดที่ฉันสร้างขึ้นด้วยตนเอง มีวิธีอื่นในการแก้ไขปัญหานี้ นี่เป็นขั้นตอนแรกที่คุณควรดำเนินการก่อนเลือกตัวเลือกอื่น ๆ
ขอบคุณ John Saunders ที่โพสต์ด้านบนซึ่งทำให้ฉันมีความคิดที่จะมองเข้าไปในหน้าต่างข้อผิดพลาด ฉันห่อของฉันไว้ตลอดทั้งวันและมองไปที่หน้าต่าง Output เพื่อหาข้อผิดพลาด
ในกรณีของฉันผู้ร้ายถูกปรับไม่ได้ ฉันมีคลาส DataContract พร้อมคุณสมบัติ DataMember ประเภทข้อยกเว้น คุณไม่สามารถมี DataMember ประเภทใดก็ได้ที่มีคำหลักที่ปรับเปลี่ยนได้ ในข้อยกเว้นนี้มีการปรับเปลี่ยนได้ทันทีที่ฉันลบมันทุกอย่างทำงานเหมือนมีเสน่ห์
เมื่อพยายามแก้ไขปัญหานี้ด้วยsvcutil
ฉันได้รับข้อผิดพลาดที่อ้างถึงในคำตอบของ dblood ("ประเภทอ้างอิงไม่สามารถใช้งานได้เนื่องจากไม่ตรงกับ DataContract ที่นำเข้า")
ในกรณีของฉันสาเหตุพื้นฐานดูเหมือนจะเป็นประเภท enum ที่มีแอตทริบิวต์ DataContract แต่สมาชิกที่ไม่ได้ทำเครื่องหมายด้วยคุณสมบัติ EnumMember ระดับปัญหาsvcutil
ชี้ไปที่มีคุณสมบัติที่มีประเภท enum นั้น
นี่น่าจะเหมาะกว่ากับความเห็นต่อคำตอบของ dblood แต่ตัวแทนไม่เพียงพอสำหรับเรื่องนั้น ...
ในกรณีของฉันฉันมีวิธีแก้ปัญหาด้วยโครงการ VB Web Forms ที่อ้างถึง C # UserControl ทั้งโครงการ VB และโครงการ CS มีการอ้างอิงบริการกับบริการเดียวกัน การอ้างอิงปรากฏภายใต้การอ้างอิงบริการในโครงการ VB และภายใต้การเชื่อมต่อบริการกลุ่มในโครงการ CS (กรอบ)
เพื่ออัปเดตการอ้างอิงบริการ (เช่นรับไฟล์ Reference.vb เป็นไม่ว่าง) ในโครงการ VB web form ฉันจำเป็นต้องลบโครงการ CS จากนั้นอัปเดตการอ้างอิงบริการ VB จากนั้นเพิ่มโครงการ CS กลับเข้าไปใน การแก้ไขปัญหา.
ทำตามขั้นตอนเหล่านี้:
ดูเหมือนว่าการอ้างอิงบางอย่างจะถูกเก็บไว้ในโฟลเดอร์เหล่านี้เมื่อเพิ่มบริการทำให้เกิดข้อผิดพลาดระหว่างการสร้างรหัสโดยอัตโนมัติ