Jawaban:
Secara umum saya menemukan bahwa ini adalah masalah kode-gen dan kebanyakan besar waktu itu karena saya punya jenis konflik nama yang tidak bisa diselesaikan.
Jika Anda mengklik kanan pada referensi layanan Anda dan mengklik configure dan hapus centang "Gunakan Kembali Jenis dalam Majelis Dirujuk" itu kemungkinan akan menyelesaikan masalah.
Jika Anda menggunakan beberapa aspek dari fitur ini, Anda mungkin perlu memastikan nama Anda dibersihkan.
Sebagai jawaban yang diterima menunjukkan, masalah referensi jenis ketika menggunakan kembali jenis mungkin adalah penyebabnya. Saya menemukan ketika Anda tidak dapat dengan mudah menentukan masalah kemudian menggunakan perintah svcutil.exe akan membantu Anda mengungkapkan masalah yang mendasarinya (seperti yang ditunjukkan oleh John Saunders).
Sebagai perangkat tambahan di sini adalah contoh cepat menggunakan svcutil.
svcutil /t:code https://secure.myserver.com/services/MyService.svc /d:test /r:"C:\MyCode\MyAssembly\bin\debug\MyAssembly.dll"
Dimana:
Referensi baris perintah svcutil lengkap di sini: http://msdn.microsoft.com/en-us/library/aa347733.aspx
Setelah Anda menjalankan svcutil, Anda akan melihat pengecualian dilemparkan oleh impor. Anda dapat menerima jenis pesan ini tentang salah satu tipe Anda: "tipe referensi tidak dapat digunakan karena tidak cocok dengan DataContract yang diimpor".
Ini bisa saja seperti yang ditentukan dalam bahwa ada perbedaan dalam salah satu jenis dalam rakitan referensi dari apa yang dihasilkan dalam DataContract untuk layanan. Dalam kasus saya, layanan yang saya impor memiliki tipe yang lebih baru dan diperbarui dari apa yang saya miliki di majelis bersama. Ini tidak mudah terlihat karena jenis yang disebutkan dalam pengecualian tampaknya sama. Apa yang berbeda adalah salah satu tipe kompleks bersarang yang digunakan oleh tipe tersebut.
Ada skenario lain yang lebih kompleks yang dapat memicu jenis pengecualian ini dan menghasilkan referensi kosong.cs. Ini salah satu contohnya .
Jika Anda mengalami masalah ini dan Anda tidak menggunakan tipe generik dalam kontrak data Anda juga tidak menggunakan IsReference = true, maka saya sarankan untuk memastikan bahwa tipe yang Anda bagikan sama persis pada klien dan server Anda. Jika tidak, Anda kemungkinan akan mengalami masalah ini.
Ketika ini terjadi, lihat di jendela Kesalahan dan jendela Output untuk melihat apakah ada pesan kesalahan. Jika itu tidak membantu, coba jalankan svcutil.exe
secara manual, dan lihat apakah ada pesan kesalahan.
Saya telah memukul kepala saya sepanjang hari dengan masalah yang pasti ini. Saya baru saja memperbaikinya. Begini caranya ...
Layanan harus berjalan lebih dari SSL (yaitu di https://mydomain.com/MyService.svc )
Menambahkan referensi layanan ke layanan WCF di server pengembangan berfungsi dengan baik.
Menyebarkan susunan layanan WCF yang sama persis di server produksi langsung, kemudian beralih ke aplikasi klien dan mengonfigurasi referensi layanan untuk menunjuk ke layanan langsung ditampilkan tidak ada kesalahan tetapi aplikasi tidak akan membangun: Ternyata referensi layanan itu File Reference.cs benar-benar kosong! Memperbarui referensi layanan tidak membuat perbedaan. Membersihkan solusinya tidak membantu. Restart VS2010 tidak membuat perbedaan. Membuat solusi kosong baru, memulai proyek konsol dan menambahkan referensi layanan ke layanan langsung menunjukkan masalah yang sama persis.
Saya tidak berpikir itu karena jenis yang saling bertentangan atau apa, tapi apa-apaan - saya mengkonfigurasi ulang referensi layanan WCF dengan menghapus centang "Gunakan kembali jenis dalam semua rujukan yang direferensikan". Tidak ada sukacita; Saya mengembalikan tanda centang.
Langkah selanjutnya adalah mencoba svcutil pada URL referensi untuk melihat apakah itu akan membantu mengungkap masalah. Inilah perintahnya:
svcutil /t:code https://mydomain.com/MyService.svc /d:D:\test
Ini menghasilkan sebagai berikut:
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.
Itu membuat saya benar-benar bingung. Meskipun googling yang berat dan menjadi sangat kesal, dan mempertimbangkan kembali karier sebagai sopir bus, saya akhirnya mempertimbangkan mengapa itu bekerja dengan baik pada kotak pengembangan. Mungkinkah itu masalah konfigurasi IIS?
Saya mengirim ulang secara bersamaan ke kotak pengembangan dan langsung, dan pada masing-masing saya meluncurkan IIS Manager (menjalankan IIS 7.5). Selanjutnya, saya pergi melalui setiap pengaturan konfigurasi pada setiap kotak, membandingkan nilai pada setiap server.
Dan ada masalahnya: Di bawah "Pengaturan SSL" untuk situs, pastikan "Wajibkan SSL" dicentang, dan periksa tombol radio Sertifikat Klien untuk "Terima". Masalah diperbaiki!
Saya menemukan ini terjadi secara umum setiap kali saya menambahkan referensi, menghapusnya, dan kemudian menambahkan kembali layanan dengan nama yang sama. Konflik jenis tampaknya disebabkan oleh file lama yang tersisa di suatu tempat yang Visual Studio masih bisa melihat. Yang perlu saya lakukan untuk memperbaikinya, adalah bersih sebelum menambahkan referensi baru.
Semoga ini membantu.
Saya punya masalah dengan Silverlight 5 yang ditingkatkan dari versi sebelumnya.
Bahkan menambahkan kembali referensi layanan masih memberi saya Reference.cs kosong
Saya akhirnya harus membuat proyek baru dan menciptakan kembali referensi layanan. Ini adalah sesuatu untuk dicoba jika Anda telah menghabiskan lebih dari setengah jam untuk ini. Bahkan jika Anda bertekad untuk memperbaiki proyek asli, Anda mungkin ingin mencoba ini hanya untuk melihat apa yang terjadi dan kemudian bekerja mundur untuk mencoba memperbaiki masalah.
Saya tidak pernah mencari tahu apa masalahnya - tetapi mungkin ada sesuatu dalam file .csproj yang tidak ditingkatkan atau ada pengaturan yang salah.
System.Xml.Linq
- jadi periksa versi semua DLL Anda jika Anda telah beralih versi
Jika Anda baru-baru ini menambahkan koleksi ke proyek Anda ketika ini mulai terjadi, masalahnya mungkin disebabkan oleh dua koleksi yang memiliki atribut CollectionDataContract yang sama :
[CollectionDataContract(Name="AItems", ItemName="A")]
public class CollectionA : List<A> { }
[CollectionDataContract(Name="AItems", ItemName="A")] // Wrong
public class CollectionB : List<B> { }
Saya memperbaiki kesalahan dengan menyapu proyek saya dan memastikan bahwa setiap atribut Nama dan ItemName adalah unik:
[CollectionDataContract(Name="AItems", ItemName="A")]
public class CollectionA : List<A> { }
[CollectionDataContract(Name="BItems", ItemName="B")] // Corrected
public class CollectionB : List<B> { }
Kemudian saya menyegarkan referensi layanan dan semuanya bekerja kembali.
Masalah saya adalah bahwa saya meninggalkan " mex " di akhir tautan layanan web saya.
Alih-alih " http://yeagertech.com/yeagerte/YeagerTechWcfService.YeagerTechWcfService.svc/mex "
Gunakan " http://yeagertech.com/yeagerte/YeagerTechWcfService.YeagerTechWcfService.svc "
Teknik yang bekerja untuk saya dalam kasus saya, setelah membaca jawaban-jawaban ini tanpa hasil, adalah dengan mengomentari semua kontrak saya, dan menghapus bit komentar sampai tidak berfungsi lagi, dengan cara pencarian biner. Itu mempersempit sedikit kode yang menyinggung.
Maka Anda hanya perlu menebak apa yang salah dengan kode itu.
Beberapa umpan balik kesalahan dalam alat tentu saja akan membantu.
Saya menulis kontrak layanan web. Saya memiliki placeum enum tanpa anggota. Tidak apa-apa. Tetapi jika saya menggunakannya di properti kelas lain, dan menggunakan kembali dll kontrak pada klien, codegen meledak tanpa pesan kesalahan. Menjalankan svcutil.exe tidak membantu, hanya gagal menghasilkan file cs tanpa menyebutkan alasannya.
Berikut ini tidak tercantum di sini, dan itu adalah solusi yang saya adopsi (SvcUtils berguna dalam melihat pesan kesalahan. Namun, kesalahan yang saya dapatkan adalah wrapper type message cannot be projected as a data contract type since it has multiple namespaces
. Artinya, saya mengikuti petunjuk ini, dan belajar wsdl.exe
melalui pos ini ).
Dalam kasus saya, hanya menjalankan wsdl [ my-asmx-service-address ] menghasilkan .cs
file bebas masalah , yang saya sertakan dalam proyek saya dan instances untuk menggunakan layanan.
Seperti yang ditunjukkan oleh @dblood, rasa sakit utama ada di DataContractSerializer, yang tidak menggunakan kembali jenis dengan benar. Sudah ada beberapa jawaban di sini jadi saya akan mulai dengan menambahkan beberapa pro dan kontra tentang ini:
Untungnya, jika Anda mengendalikan layanan Anda, ada solusi sederhana yang menyelesaikan semua masalah ini. Ini berarti Anda masih dapat menggunakan kembali antarmuka layanan di DLL - yang merupakan IMO harus dimiliki untuk solusi yang tepat. Beginilah solusinya:
Gunakan DLL yang sama untuk membangun klien menggunakan metode favorit Anda. Misalnya (IMyInterface adalah antarmuka kontrak layanan):
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();
Dengan kata lain: Jangan gunakan fungsionalitas 'tambah referensi layanan' , tetapi paksa WCF untuk menggunakan jenis layanan (yang benar) dengan memintas pembuatan proxy. Bagaimanapun, Anda sudah memiliki kelas-kelas ini.
Pro:
Cons:
Saya juga memiliki masalah referensi layanan rusak ketika bekerja dengan referensi proyek di kedua sisi (proyek layanan dan proyek memiliki referensi ke layanan). Jika .dll dari proyek yang direferensikan misalnya disebut "Contoso.Development.Common", tetapi nama proyek hanya disingkat menjadi "Common", juga referensi proyek untuk proyek ini diberi nama hanya "Common". Namun layanan mengharapkan referensi ke "Contoso.Development.Common" untuk menyelesaikan kelas (jika opsi ini diaktifkan dalam opsi referensi layanan).
Jadi dengan explorer saya membuka folder proyek yang mereferensikan layanan dan proyek "Umum". Di sana saya mengedit file proyek VS (.csproj) dengan notepad. Cari nama proyek yang dirujuk (yaitu "Common.csproj" dalam contoh ini) dan Anda akan dengan cepat menemukan entri konfigurasi yang mewakili referensi proyek.
aku berubah
<ProjectReference Include="..\Common\Common.csproj">
<Project>{C90AAD45-6857-4F83-BD1D-4772ED50D44C}</Project>
<Name>Common</Name>
</ProjectReference>
untuk
<ProjectReference Include="..\Common\Common.csproj">
<Project>{C90AAD45-6857-4F83-BD1D-4772ED50D44C}</Project>
<Name>Contoso.Development.Common</Name>
</ProjectReference>
Yang penting adalah mengubah nama referensi ke nama dll proyek yang dirujuk sebagai output.
Kemudian kembali ke VS. Di sana Anda akan diminta untuk memuat ulang proyek karena telah dimodifikasi di luar VS. Klik tombol muat ulang.
Setelah melakukannya, tambahkan dan perbarui referensi layanan berfungsi seperti yang diharapkan.
Semoga ini juga membantu orang lain.
Salam MH
Saya menghadapi masalah serupa kemarin selama pengembangan. Saya menemukan saya menggunakan namespace yang sama dalam 2 versi kontrak yang berbeda.
Kami memiliki 2 versi kontrak misalnya versi4 dan versi5. Saya telah menyalin semua kontrak dari versi4 dan mengganti nama semua namespace dari versi4 ke versi5. Saat melakukan ini saya lupa untuk mengubah nama namespace dari v4 ke v5 di salah satu file. Karena konflik namespace, file Reference.cs kosong.
Masalah ini sulit untuk dipecahkan karena Anda tidak mendapatkan pesan kesalahan saat membuat referensi layanan. Untuk mengidentifikasi masalah ini, saya akan memvalidasi semua file baru yang saya buat secara manual. Ada cara lain untuk mengatasi masalah ini. Ini adalah langkah pertama yang harus Anda lakukan sebelum pergi untuk opsi lain.
Terima kasih kepada John Saunders pos di atas yang memberi saya ide untuk melihat ke dalam jendela Kesalahan. Saya mengepalkan kepala saya sepanjang hari dan saya melihat jendela Output untuk setiap kesalahan.
Dalam kasus saya pelakunya ISerializable. Saya memiliki kelas DataContract dengan properti DataMember dengan tipe Exception. Anda tidak dapat memiliki DataMember jenis apa pun yang memiliki kata kunci ISerializable. Dalam Pengecualian ini ISerializable segera setelah saya menghapus semuanya bekerja seperti pesona.
Ketika mencoba memecahkan masalah ini dengan svcutil
, saya menerima kesalahan yang dimaksud dalam jawaban dblood ("tipe yang dirujuk tidak dapat digunakan karena tidak cocok dengan DataContract yang diimpor").
Dalam kasus saya, penyebab yang mendasari tampaknya adalah tipe enum yang memiliki atribut DataContract, tetapi yang anggotanya tidak ditandai dengan atribut EnumMember. Kelas masalahsvcutil
ditunjuk memiliki properti dengan tipe enum itu.
Ini akan lebih cocok sebagai komentar untuk jawaban dblood, tetapi tidak cukup perwakilan untuk itu ...
Dalam kasus saya, saya punya solusi dengan proyek VB Web Forms yang mereferensikan C # UserControl. Baik proyek VB dan proyek CS memiliki Referensi Layanan untuk layanan yang sama. Referensi muncul di bawah Referensi Layanan di proyek VB dan di bawah pengelompokan Layanan Terhubung dalam proyek CS (kerangka kerja).
Untuk memperbarui referensi layanan (yaitu, dapatkan file Reference.vb agar tidak kosong) di proyek formulir web VB, saya perlu MENGHAPUS PROYEK CS, kemudian memperbarui Referensi Layanan VB, kemudian menambahkan proyek CS kembali ke solusinya.
Ikuti langkah ini:
Tampaknya beberapa referensi tertinggal di folder ini ketika menambahkan layanan, menyebabkan kesalahan selama pembuatan kode secara otomatis.