Layanan tidak memiliki titik akhir aplikasi (non-infrastruktur)

91

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.

pengguna280626
sumber
2
Definisi kontrak layanan harus disalin dari service.dll.config ke service.exe.config.
John Saunders
1
dapatkah Anda menunjukkan kepada kami app.config layanan ?? Apakah Anda melakukan sesuatu yang khusus dalam layanan NT untuk membuat instantiate / membuka ServiceHost?
marc_s

Jawaban:

94

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.

SteveCav
sumber
Ya, kami mengubah namespace sehingga tidak dapat menemukan layanan yang cocok dengan yang ada di file .svc (garis bawah diganti dengan titik!) Pemeriksaan cepat dari nama layanan mengungkapkan apa yang terjadi.
1
Memecahkan masalah saya juga, suka perbaikan cepat dan mudah ini!
vfilby
Menambahkan web.config membantu menyelesaikan kesalahan ini untuk saya.
Ryan Rodemoyer
2
Ini memecahkan masalah saya !!! Terima kasih banyak! Untuk semua perpisahan seperti saya: sarankan tutorial yang sangat jelas ini: lourenco.co.za/blog/2013/08/…
Homer1982
12

Endpoint juga harus memiliki namespace:

 <endpoint address="uri" binding="wsHttpBinding" contract="Namespace.Interface" />
Asif Khan
sumber
Saya memiliki ini di app.config tetapi saya ingin mengubahnya dalam kode tanpa menghapusnya dari app.config. Menggunakan ServiceHost baru dengan alamat titik akhir baru memberikan kesalahan.
Paul McCarthy
9

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.

Kevin Won
sumber
1
Terima kasih sudah menanggapi begitu cepat. Saya menyalin app.config saya dari WCF (dll) saya, jadi saya tidak berpikir itu masalahnya. Tetapi saya merasa aneh bahwa saya dapat membawa WCF (dll) saya menggunakan WcfTestclient.exe tanpa masalah apa pun. Menurut saya, jika ada yang salah dengan file konfigurasi, seharusnya file tersebut juga gagal, tidak hanya ketika saya mencoba menjalankannya di Windows Service Host (exe). Saya minta maaf jika saya terdengar "sedikit" tersesat, saya masih pemula di WCF dan sayangnya. Ada saran lain?
pengguna280626
9

Cukup salin file App.config dari proyek layanan ke aplikasi host konsol dan tempel di sini, lalu hapus dari proyek layanan.

usufhamad
sumber
5

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();
LCJ
sumber
1
Terima kasih! menyampaikan alamat dengan cara ini menunjukkan kepada saya detail lebih lanjut tentang pengecualian. Dalam kasus saya, port tersebut hanya digunakan oleh proses lain :)
Hernan Veiras
Saya memiliki masalah yang sama apakah alamat dasar sama dengan alamat ketika Anda mengklik temukan di tambahkan referensi Layanan?
ZoomVirus
4

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.

Uğur Aldanmaz
sumber
1
Maksudmu seperti yang saya jawab di sini empat tahun sebelumnya?
SteveCav
Mereka terlihat sama tapi ada satu perbedaan. Contoh salah Anda adalah tentang menulis hanya nama kelas ( TechResponse) tetapi saya hanya menulis namespace ( ServiceNameSpace).
Uğur Aldanmaz
4

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>
Abu
sumber
Sama disini. Saya mengubah kapitalisasi kelas dan nama kontrak saya dan semuanya berfungsi. Terima kasih.
Chazaq
3

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

Bo Christian Skjøtt
sumber
Ketika saya menggunakan metode ini saya mendapatkan AddressAccessDeniedException meskipun saya dapat menggunakan alamat ini untuk alamat addServiceReferance Anda.
ZoomVirus
2

Saya baru saja mengatasi masalah ini pada layanan saya. Inilah kesalahan yang saya terima:

Layanan 'EmailSender.Wcf.EmailService' 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.

Berikut dua langkah yang saya gunakan untuk memperbaikinya:

  1. Gunakan nama kelas yang sepenuhnya memenuhi syarat:

    <service behaviorConfiguration="DefaultBehavior" name="EmailSender.Wcf.EmailService">
    
  2. Aktifkan titik akhir dengan mexHttpBinding, dan yang terpenting, gunakan kontrak IMetadataExchange:

    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
    
letsgetsilly
sumber
2

Kesalahan ini akan terjadi jika file konfigurasi dari aplikasi hosting layanan WCF Anda tidak memiliki konfigurasi yang tepat.

Ingat komentar ini dari konfigurasi:

Saat menerapkan proyek perpustakaan layanan, konten file konfigurasi harus ditambahkan ke file app.config host. System.Configuration tidak mendukung file konfigurasi untuk perpustakaan.

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.

atconway
sumber
2

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.

wasted30minOnThis
sumber
Hanya mengalami hal yang sama. Mungkin sulit ditemukan, terutama saat melakukan refaktorisasi basis kode yang besar. Ingatlah untuk memperbarui ruang nama di konfigurasi WCF saat memindahkan sesuatu.
Arve Systad
2

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.

DfrDkn
sumber
Ini telah menghemat banyak waktu saya. :)
Parag
1

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.

Michael
sumber
1

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

Neo
sumber
1

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.

Juan
sumber
0

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.

Volomike
sumber