Saya baru-baru ini membuat layanan WCF (dll) dan host layanan (exe). Saya tahu layanan WCF saya berfungsi dengan benar karena saya berhasil menambahkan layanan ke WcfTestClient.
Namun, saya tampaknya mengalami masalah ketika saya menggunakan WCF saya dari host layanan (exe). Saya dapat menambahkan referensi ke WCF (dll) ke host layanan saya (exe) dan membuat komponen yang diperlukan ke exe; seperti penginstal layanan, host layanan, dan app.config, kompilasi dan terakhir instal exe menggunakan InstallUtil. Namun, ketika saya mencoba memulai layanan di Konsol Manajemen Microsoft, layanan segera berhenti setelah dimulai.
Jadi saya mulai menyelidiki apa yang sebenarnya bisa menyebabkan masalah ini dan muncul dengan kesalahan ini dari Log Aplikasi di Peraga Peristiwa.
Deskripsi:
Layanan tidak dapat dimulai. System.InvalidOperationException: Layanan 'Layanan' tidak memiliki titik akhir aplikasi (non-infrastruktur). Ini mungkin karena tidak ada file konfigurasi yang ditemukan untuk aplikasi Anda, atau karena tidak ada elemen layanan yang cocok dengan nama layanan yang dapat ditemukan di file konfigurasi, atau karena tidak ada titik akhir yang ditentukan dalam elemen layanan.
Kesalahan ini sebenarnya dihasilkan di OnStart
; exe saya, ketika saya melakukan panggilan ini ServiceHost.Open()
. Saya telah melihat banyak posting di mana orang lain mengalami masalah ini, namun sebagian besar, jika tidak semuanya, mengklaim bahwa nama layanan atau kontrak; namespace dan nama kelas, tidak ditentukan. Saya memeriksa kedua entri ini di file konfigurasi saya; di exe maupun di dll, dan mereka cocok dengan sempurna. Saya meminta orang lain di kantor mengecek ulang di belakang saya untuk memastikan saya tidak akan buta pada satu titik, tetapi tentu saja mereka sampai pada kesimpulan yang sama seperti saya bahwa semuanya tampak seperti itu ditentukan dengan benar. Saya benar-benar bingung dengan apa yang sedang terjadi pada saat ini. Adakah yang bisa membantu saya dengan masalah ini?
Hal lain yang muncul sebagai kemungkinan alasan hal ini mungkin terjadi adalah app.config tidak pernah dibaca; setidaknya bukan yang menurut saya harus dibaca. Mungkinkah ini masalahnya? Jika demikian, bagaimana saya bisa mengatasi masalah ini. Sekali lagi, bantuan APAPUN akan dihargai.
sumber
Jawaban:
Saya baru saja mengalami masalah ini dan menyelesaikannya dengan menambahkan namespace ke nama layanan, mis
<service name="TechResponse">
menjadi
<service name="SvcClient.TechResponse">
Saya juga melihatnya diselesaikan dengan Web.config alih-alih App.config.
sumber
Endpoint juga harus memiliki namespace:
<endpoint address="uri" binding="wsHttpBinding" contract="Namespace.Interface" />
sumber
Satu hal yang perlu dipikirkan adalah: Apakah WCF Anda benar-benar dilepaskan dari WindowsService (WS)? WS menyakitkan karena Anda tidak memiliki banyak kontrol atau visibilitas ke sana. Saya mencoba untuk mengurangi ini dengan memiliki semua barang non-WS saya di kelas mereka sendiri sehingga mereka dapat diuji secara independen dari host WS. Menggunakan pendekatan ini dapat membantu Anda menghilangkan apa pun yang terjadi dengan runtime WS vs. layanan Anda secara khusus.
John mungkin benar bahwa ini adalah masalah file .config. WCF akan selalu mencari konteks eksekusi .config . Jadi jika Anda menghosting WCF Anda dalam konteks eksekusi yang berbeda (yaitu, menguji dengan aplikasi konsol, dan menerapkan dengan WS), Anda perlu memastikan bahwa Anda memiliki data konfigurasi WCF yang dipindahkan ke file .config yang sesuai. Tetapi masalah mendasar bagi saya adalah Anda tidak tahu apa masalahnya karena WS goo menghalangi. Jika Anda belum memfaktorkan ulang untuk itu sehingga Anda dapat menjalankan layanan Anda dalam konteks apa pun (yaitu, pengujian unit atau konsol), maka saya akan menyarankan untuk melakukannya. Jika Anda memutar layanan Anda dalam pengujian unit, kemungkinan besar akan gagal dengan cara yang sama seperti yang Anda lihat dengan WS yang jauh lebih mudah untuk di-debug daripada mencoba melakukannya dengan pipa WS yang kotor.
sumber
Cukup salin file App.config dari proyek layanan ke aplikasi host konsol dan tempel di sini, lalu hapus dari proyek layanan.
sumber
Saya mendapat pengecualian yang lebih mendetail saat menambahkannya secara terprogram -
AddServiceEndpoint
:string baseAddress = "http://" + Environment.MachineName + ":8000/Service"; ServiceHost host = new ServiceHost(typeof(Service), new Uri(baseAddress)); host.AddServiceEndpoint(typeof(MyNamespace.IService), new BasicHttpBinding(), baseAddress); host.Open();
sumber
Untuk mempersiapkan konfigurasi untuk WCF sulit, dan terkadang definisi jenis layanan tidak diperhatikan.
Saya hanya menulis namespace di tag servis, jadi saya mendapat kesalahan yang sama.
<service name="ServiceNameSpace">
Jangan lupa, tag servis membutuhkan nama kelas layanan yang memenuhi syarat.
<service name="ServiceNameSpace.ServiceClass">
Untuk orang lain yang seperti saya.
sumber
TechResponse
) tetapi saya hanya menulis namespace (ServiceNameSpace
).Hari ini saya mengalami masalah yang sama, memposting di sini kesalahan dan koreksi saya sehingga dapat membantu seseorang.
Saat menyusun ulang kode, saya sebenarnya telah mengubah kelas Layanan dan nama Layanan dan mengubah ServiceHost untuk menunjuk ke nama kelas Layanan baru ini (seperti yang ditunjukkan dalam cuplikan kode) tetapi di aplikasi host saya file App.Config saya masih menggunakan nama kelas Layanan lama . (lihat bidang nama bagian konfigurasi di cuplikan di bawah)
Ini cuplikan kodenya,
ServiceHost myServiceHost = new ServiceHost(typeof(NewServiceClassName));
dan di file App.config di bawah bagian layanan saya mengacu pada nama kelas layanan lama, mengubahnya menjadi masalah baru ServiceClassName untuk saya.
<service name="ProjectName.OldServiceClassName"> <endpoint address="" binding="basicHttpBinding" contract="ProjectName.IService"> <identity> <dns value="localhost"/> </identity> </endpoint> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> <host> <baseAddresses> <add baseAddress=""/> </baseAddresses> </host> </service>
sumber
Saya memiliki masalah yang sama. Semuanya bekerja di VS2010 tetapi ketika saya menjalankan proyek yang sama di VS2008 saya mendapatkan pengecualian yang disebutkan.
Apa yang saya lakukan dalam proyek VS2008 saya untuk membuatnya bekerja adalah menambahkan panggilan ke
AddServiceEndpoint
anggota objek ServiceHost saya.Ini cuplikan kode saya:
Uri baseAddress = new Uri("http://localhost:8195/v2/SystemCallbackListener"); ServiceHost host = new ServiceHost(typeof(SystemCallbackListenerImpl), baseAddress); host.AddServiceEndpoint(typeof(CsfServiceReference.SystemCallbackListener), new BasicHttpBinding(), baseAddress); host.Open();
Saya tidak mengubah file app.config. Tapi saya kira titik akhir layanan juga bisa ditambahkan di file .config.
sumber
Saya baru saja mengatasi masalah ini pada layanan saya. Inilah kesalahan yang saya terima:
Berikut dua langkah yang saya gunakan untuk memperbaikinya:
Gunakan nama kelas yang sepenuhnya memenuhi syarat:
<service behaviorConfiguration="DefaultBehavior" name="EmailSender.Wcf.EmailService">
Aktifkan titik akhir dengan mexHttpBinding, dan yang terpenting, gunakan kontrak IMetadataExchange:
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
sumber
Kesalahan ini akan terjadi jika file konfigurasi dari aplikasi hosting layanan WCF Anda tidak memiliki konfigurasi yang tepat.
Ingat komentar ini dari konfigurasi:
Jika Anda memiliki Layanan WCF yang dihosting di IIS, selama runtime melalui VS.NET itu akan membaca app.config dari proyek perpustakaan layanan, tetapi membaca web.config host setelah diterapkan. Jika web.config tidak memiliki
<system.serviceModel>
konfigurasi yang sama, Anda akan menerima kesalahan ini. Pastikan untuk menyalin konfigurasi dari app.config setelah disempurnakan.sumber
Saya baru saja mengalami masalah ini dan memeriksa semua jawaban di atas untuk memastikan saya tidak melewatkan sesuatu yang jelas. Nah, saya memiliki masalah yang agak jelas. Kapitalisasi nama kelas saya dalam kode dan nama kelas yang saya gunakan di file konfigurasi tidak cocok.
Misalnya: jika nama kelasnya adalah CalculatorService dan file konfigurasinya merujuk ke Calculatorservice ... Anda akan mendapatkan kesalahan ini.
sumber
Saya menjalankan Visual Studio dalam mode Administrator dan itu berhasil untuk saya :) Juga, pastikan bahwa file app.config yang Anda gunakan untuk menulis konfigurasi WCF harus dalam proyek di mana kelas "ServiceHost" digunakan, dan bukan dalam layanan WCF yang sebenarnya proyek.
sumber
Masalah saya adalah ketika saya mengganti nama kelas Service1 default saya untuk file .svc menjadi nama yang lebih bermakna, yang menyebabkan web.config behaviourConfiguration dan endpoint sesuai dengan konvensi penamaan lama. Cobalah untuk memperbaiki web.config Anda.
sumber
Satu hal penting untuk diingat bagi mereka yang bekerja dengan aplikasi Console untuk menghosting layanan WCF adalah bahwa file Web.config dalam proyek WCF diabaikan sama sekali. Jika
system.serviceModel
konfigurasi Anda ada di sana, maka Anda perlu memindahkan bagian konfigurasi tersebut ke App.config dari proyek Konsol Anda.Ini sebagai tambahan untuk jawaban tentang memastikan namespace ditentukan di tempat yang tepat.
sumber
Sebagai petunjuk lain, itu memang memperbaiki masalah ini dalam kasus saya.
Saya memigrasikan beberapa layanan WCF dari aplikasi konsol (yang mengonfigurasi dalam beberapa kode layanan WCF) ke Peran Web Azure untuk menerbitkannya di Azure. Setiap kali saya menambahkan layanan baru VS mengedit web.config saya dan menambahkan baris ini:
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true">
Nah, dengan semua saran dan jawaban di atas saya tidak bisa membuatnya berfungsi sampai saya menghapus semua atribut di elemen serviceHostingEnvironment. Seperti yang Anda lihat, saya bukan seorang rockstar WCF, tetapi saya berhasil menggunakan Layanan pertama hanya dengan mengonfigurasinya sebagai:
<service name="FirstService" behaviorConfiguration="metadataBehavior"> <endpoint address="" binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_WcfServicesBinding" contract="IFirstService" /> </service>
tetapi ketika saya menambahkan Layanan kedua itu berhenti bekerja dan saya menyadari bahwa atribut-atribut itu ada lagi.
Saya harap ini menghemat waktu Anda.
sumber
Saya mengalami kesalahan ini di Layanan Windows ketika Perpustakaan Layanan WCF yang saya buat tidak terhubung ke hosting, tetapi terhubung untuk koneksi. Saya kehilangan titik akhir. (Saya ingin koneksi dan hosting di Layanan Windows saya sehingga saya dapat melayani Layanan WCF ke koneksi lain, serta memiliki proses utama Layanan Windows saya menggunakannya juga untuk melakukan berbagai tugas pada pengatur waktu / jadwal.)
Perbaikannya adalah saya memilih kanan file App.config saya dan memilih Edit WCF Configuration. Kemudian, saya melakukan langkah-langkah untuk Membuat Layanan sehingga saya dapat terhubung ke Layanan WCF saya. Sekarang saya memiliki dua titik akhir di App.config saya, bukan hanya satu. Satu titik akhir untuk koneksi ke Perpustakaan Layanan WCF, dan yang lainnya untuk hostingnya.
sumber