Terkadang menambahkan Referensi Layanan WCF menghasilkan reference.cs kosong

159

Terkadang menambahkan Referensi Layanan WCF menghasilkan reference.cs kosong dan saya tidak bisa merujuk layanan di mana pun dalam proyek ini.

Adakah yang mengalami ini?

Mat
sumber

Jawaban:

377

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.

Anderson Imes
sumber
5
Ketika itu terjadi pada saya, saya menemukan bahwa saya juga perlu mengubah Jenis Koleksi dari ObjectModel.ObservableCollection ke Generic.List
Yossi Dahan
2
Terjadi pada saya karena saya menambahkan ke kelas parsial.
Makotosan
2
Namun jika Anda ingin menggunakan jenis dari tertentu perakitan, Anda dapat memilih hanya itu perakitan dan bekerja sama dengan baik (setidaknya dalam kasus saya), ta
Dead.Rabit
26
Ini mengejutkan saya bahwa saya mendapatkan rata-rata 50 poin per minggu dari pertanyaan ini bahkan 6 tahun kemudian. Ayo MS, perbaiki ini. Setidaknya berikan pengembang beberapa umpan balik ketika ini berjalan buruk bukannya membuat mereka menatap file kosong.
Anderson Imes
1
9 tahun kemudian dan Anda masih membantu. Terima kasih!
parameter
38

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:

  • / t: kode menghasilkan kode dari url yang diberikan
  • / d: untuk menentukan direktori untuk output
  • / r: untuk menentukan rakitan referensi

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.

dblood
sumber
Dalam kasus saya, ini terjadi setelah saya mereferensikan sebuah majelis yang juga mereferensikan layanan WCF saya. Menghapus perakitan itu dari daftar majelis untuk berbagi jenis dengan memperbaikinya.
xr280xr
Saya mendapatkan pesan kesalahan yang tidak berarti (hanya namespace) ketika menambahkan Referensi Layanan dan ini menunjukkan masalahnya.
bcampolo
12

Ketika ini terjadi, lihat di jendela Kesalahan dan jendela Output untuk melihat apakah ada pesan kesalahan. Jika itu tidak membantu, coba jalankan svcutil.exesecara manual, dan lihat apakah ada pesan kesalahan.

John Saunders
sumber
@ Bagaimana menjalankan svcutil.exe? Bisakah kamu membantuku ?
Arul Sidthan
@Arul: Gunakan Google untuk menemukan informasi tentang svcutil.exe.
John Saunders
2
Tidak yakin apakah Microsoft telah membaca posting ini tetapi bahkan hanya menampilkan kotak pesan yang mengatakan kesalahan dan peringatan alih-alih hanya diam-diam meletakkannya di jendela (Daftar Kasus yang diperkecil) dalam kasus saya akan membuatnya jadi saya tidak perlu ke Google ini. Atau saya kira itu akan berguna untuk memiliki tampilan tab merah atau kuning ketika ada peringatan / kesalahan baru?
jrh
12

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!

Matt Kane
sumber
5

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.

  1. Hapus referensi layanan yang mengalami masalah.
  2. Klik pada nama proyek di Solution Explorer untuk menyorot proyek.
  3. Klik kanan pada referensi proyek.
  4. Di dekat bagian atas daftar konteks, klik item Bersihkan .
  5. Tambahkan referensi layanan Anda seperti biasa.

Semoga ini membantu.

pengguna1353936
sumber
3

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.

Simon_Weaver
sumber
1
ok ternyata saya mereferensikan versi lama System.Xml.Linq- jadi periksa versi semua DLL Anda jika Anda telah beralih versi
Simon_Weaver
1

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.

Jon Person
sumber
1

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.

Yosua Hukum
sumber
Mengomentari semua kontrak operasi berhasil untuk saya. Saya melihat metode yang salah sebagai pelakunya. Terima kasih atas pendekatan kembali ke dasar untuk pemecahan masalah.
fizch
1

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.exemelalui pos ini ).

Dalam kasus saya, hanya menjalankan wsdl [ my-asmx-service-address ] menghasilkan .csfile bebas masalah , yang saya sertakan dalam proyek saya dan instances untuk menggunakan layanan.

Veverke
sumber
0

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:

  • Bendera 'IsReference' menyebabkan banyak masalah, tetapi menghapusnya tidak selalu merupakan jawaban (khususnya: dalam situasi dengan rekursi).
  • Masalah yang mendasarinya adalah bahwa kontrak data entah bagaimana tidak sama dengan nama-nama jenis, meskipun kadang-kadang (ya? Ya, Anda membacanya kan!). Tampaknya serializer cukup pilih-pilih dan sangat sulit untuk menemukan masalah sebenarnya.
  • Menghapus 'pemeriksaan referensi' dari 'Konfigurasikan referensi layanan' berfungsi, tetapi memberi Anda beberapa implementasi. Namun, saya sering menggunakan kembali antarmuka SOAP di DLL. Juga, di sebagian besar SOA dewasa yang saya tahu, beberapa antarmuka layanan mengimplementasikan dan memperluas kelas antarmuka yang sama. Menghapus 'gunakan jenis yang direferensikan' akan menghasilkan situasi di mana Anda tidak bisa begitu saja menyerahkan objek lagi.

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:

  1. Buat antarmuka DLL terpisah. Dalam DLL itu, sertakan semua DataContract dan ServiceContract; letakkan ServiceContract di antarmuka Anda.
  2. Turunkan implementasi server dari antarmuka.
  3. 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:

  1. Anda melewati proses svcutil.exe, yang berarti Anda tidak memiliki masalah IsReference
  2. Jenis dan nama DataContract benar berdasarkan definisi; setelah semua, baik server dan klien menggunakan definisi yang sama.
  3. Jika Anda memperpanjang API atau menggunakan jenis dari DLL lain, (1) dan (2) masih berlaku, jadi Anda tidak akan berjalan dalam masalah di sana.

Cons:

  1. Metode A-sync sangat merepotkan, karena Anda tidak menghasilkan proxy a-sync. Akibatnya, saya tidak akan merekomendasikan melakukan ini di aplikasi Silverlight.
atlaste
sumber
0

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

Martype
sumber
0

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.

arif.khan.b
sumber
0

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.

Ziggler
sumber
0

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 ...

Pengiris berlapis
sumber
0

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.

INFO equipt
sumber
0

Ikuti langkah ini:

  1. Hapus Referensi Layanan
  2. Tutup Visual Studio
  3. Hapus / Buang dan / Obj folder.
  4. Buka Visual Studio.
  5. Tambahkan Referensi Layanan.
  6. Sama-sama :)

Tampaknya beberapa referensi tertinggal di folder ini ketika menambahkan layanan, menyebabkan kesalahan selama pembuatan kode secara otomatis.

Exel Gamboa
sumber