Hizmetin sıfır uygulama (altyapı dışı) uç noktası var


91

Yakın zamanda bir WCF hizmeti (dll) ve bir hizmet ana bilgisayarı (exe) oluşturdum. Hizmeti başarıyla WcfTestClient'e ekleyebildiğim için WCF hizmetimin düzgün çalıştığını biliyorum.

Ancak, WCF'mi bir hizmet sunucusundan (exe) kullanmaya başladığımda bir sorunla karşılaşıyorum. Servis ana bilgisayarıma (exe) WCF (dll) için bir referans ekleyebilir ve exe için gerekli bileşenleri oluşturabilirim; hizmet yükleyicisi, hizmet ana bilgisayarı ve app.config gibi, InstallUtil kullanarak exe'yi derleyin ve son olarak yükleyin. Ancak hizmeti Microsoft Yönetim Konsolu'nda başlatmaya çalıştığımda, hizmet başlatıldıktan hemen sonra duruyor.

Bu yüzden, bu soruna tam olarak neyin neden olabileceğini araştırmaya başladım ve Olay Görüntüleyicideki Uygulama Günlüğünden bu hatayla karşılaştım.

Açıklama:

Hizmet başlatılamıyor. System.InvalidOperationException: "Hizmet" hizmetinin sıfır uygulama (altyapı dışı) uç noktası var. Bunun nedeni, uygulamanız için hiçbir yapılandırma dosyasının bulunmaması veya yapılandırma dosyasında hizmet adıyla eşleşen hiçbir hizmet öğesinin bulunamaması veya hizmet öğesinde hiçbir uç noktanın tanımlanmamış olması olabilir.

Bu hata aslında OnStart; exe'mden, bu aramayı yaptığımda ServiceHost.Open(). Diğer kişilerin bu sorunla karşılaştığı çok sayıda gönderi gördüm, ancak hepsi olmasa da çoğu hizmet adı veya sözleşmesini iddia ediyor; ad alanı ve sınıf adı belirtilmiyor. Bu iki girişi de yapılandırma dosyamda kontrol ettim; hem exe hem de dll'de ve MÜKEMMEL eşleşiyorlar. Bir noktada kör olmadığımdan emin olmak için ofisteki diğer insanları iki kez kontrol ettim, ama elbette benimle aynı sonuca vardılar, her şeyin doğru şekilde belirtilmiş gibi göründüğü. Bu noktada neler olup bittiğini gerçekten bilemiyorum. Biri bana bu konuda yardımcı olabilir mi?

Bunun olmasının olası bir nedeni olarak ortaya çıkan başka bir şey de app.config dosyasının asla okunmamasıdır; en azından okunması gerektiğini düşündüğüm değil. Sorun bu olabilir mi? Öyleyse, bu sorunu nasıl çözebilirim? Yine, HERHANGİ bir yardım takdir edilecektir.


2
Hizmet sözleşmesinin tanımı, service.dll.config dosyasından service.exe.config dosyasına kopyalanmalıdır.
John Saunders

1
bize hizmetin app.config dosyasını gösterebilir misin? ServiceHost'u başlatmak / açmak için NT hizmetinde özel bir şey yapıyor musunuz?
marc_s

Yanıtlar:


94

Bu sorunu yeni yaşadım ve ad alanını hizmet adına ekleyerek çözdüm, örn.

 <service name="TechResponse">

oldu

 <service name="SvcClient.TechResponse">

Ayrıca bir App.config yerine bir Web.config ile çözüldüğünü gördüm.


Evet, ad alanlarını .svc dosyasındakiyle eşleşen hizmeti bulamadığı için değiştirdik (alt çizgi bir noktayla değiştirildi!) Hizmet adlarının hızlı bir şekilde kontrol edilmesi ne olduğunu ortaya çıkardı.

1
Sorunumu da çözdüm, bu hızlı ve kolay düzeltmeleri seviyorum!
vfilby

Bir web.config eklemek bu hatayı çözmemde yardımcı oldu.
Ryan Rodemoyer

2
Bu benim sorunumu çözdü !!! Çok teşekkürler! Benim gibi tüm yeni başlayanlar için: bu gerçekten açık öğreticiyi önerin
Homer1982

12

Son nokta ayrıca ad alanına sahip olmalıdır:

 <endpoint address="uri" binding="wsHttpBinding" contract="Namespace.Interface" />

Bu app.config dosyasında var ama onu app.config dosyasından kaldırmadan kodda değiştirmek istiyorum. Yeni ServiceHost'u yeni bir uç nokta adresiyle kullanmak bir hata verir.
Paul McCarthy

9

Düşünülmesi gereken bir şey şudur: WCF'niz WindowsService'den (WS) tamamen ayrılmış mı? WS acı vericidir çünkü onlar için çok fazla kontrolünüz veya görüşünüz yoktur. WS olmayan tüm eşyalarımı kendi sınıflarında bulundurarak bunu azaltmaya çalışıyorum, böylece ana bilgisayar WS'den bağımsız olarak test edilebilirler. Bu yaklaşımı kullanmak, özellikle hizmetinize karşı WS çalışma zamanıyla olan her şeyi ortadan kaldırmanıza yardımcı olabilir.

John, bunun bir .config dosyası sorunu olduğu konusunda haklı olabilir. WCF, her zaman yürütme bağlamı .config'i arar . Dolayısıyla, WCF'nizi farklı yürütme bağlamlarında barındırıyorsanız (yani, bir konsol uygulamasıyla test edin ve bir WS ile konuşlandırın), WCF yapılandırma verilerinin uygun .config dosyasına taşındığından emin olmanız gerekir. Ama benim için altta yatan mesele şu ki, sorunun ne olduğunu bilmiyorsunuz çünkü WS goo yolunuza çıkıyor. Hizmetinizi herhangi bir bağlamda (yani, birim testi veya konsol) çalıştırabilmeniz için henüz bunu yeniden düzenlemediyseniz, bunu yapmanızı öneririm. Hizmetinizi bir birim testinde döndürürseniz, büyük olasılıkla WS ile aynı şekilde başarısız olur, bu da yucky WS sıhhi tesisatıyla yapmaya çalışmak yerine hata ayıklaması çok daha kolaydır.


1
Bu kadar çabuk cevap verdiğiniz için teşekkürler. App.config dosyasını WCF (dll) dosyamdan kopyaladım, bu yüzden sorunun bu olduğunu düşünmüyorum. Ancak WCF'mi (dll) WcfTestclient.exe'yi kullanarak herhangi bir sorun yaşamadan getirebilmeyi garip buluyorum. Bana öyle geliyor ki, yapılandırma dosyasında bir sis varsa, sadece onu bir Windows Hizmet Ana Bilgisayarı'nda (exe) çalıştırmaya çalıştığımda değil, orada da başarısız olması gerekirdi. "Biraz" kaybolmuş gibi görünüyorsam özür dilerim, maalesef WCF ve hizmetler döneminde hala acemiyim. Başka öneriniz var mı?
user280626

9

App.config dosyasını hizmet projesinden konsol ana bilgisayar uygulamasına kopyalayıp buraya yapıştırın ve ardından hizmet projesinden silin.


5

Programlı olarak eklediğimde daha ayrıntılı bir istisnayla karşılaştım - 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();

1
Teşekkürler! adresi bu şekilde geçirmek bana istisnayla ilgili daha fazla ayrıntı gösterdi. Benim durumumda, bağlantı noktasının başka bir işlem tarafından kullanılmasıydı :)
Hernan Veiras

Aynı problemi yaşıyorum, Servis referansını ekle'de keşfet'e tıkladığınızda temel adresle aynı mı?
ZoomVirus

4

Yapılandırmayı WCF için hazırlamak zordur ve bazen bir hizmet türü tanımı fark edilmez.

Servis etiketinde sadece ad alanını yazdım, bu yüzden aynı hatayı aldım.

<service name="ServiceNameSpace">

Unutmayın, servis etiketinin tam nitelikli bir servis sınıfı adına ihtiyacı vardır.

<service name="ServiceNameSpace.ServiceClass">

Benim gibi olan diğer insanlar için.


1
Yani dört yıl önce burada cevapladığım gibi mi?
SteveCav

Aynı görünüyorlar ama bir fark var. Yanlış örneğiniz yalnızca sınıf adını ( TechResponse) yazmakla ilgili, benimki ise yalnızca ad alanını ( ServiceNameSpace) yazmakla ilgili .
Uğur Aldanmaz

4

Bugün aynı sorunla karşılaştım, hatamı ve düzeltmeyi buraya yazdım, böylece birisine yardımcı olabilir.

Kodu yeniden yapılandırırken, aslında Service sınıfını ve IService adlarını değiştirmiştim ve ServiceHost'u bu yeni Service sınıfı adını gösterecek şekilde değiştirmiştim (kod parçacığında gösterildiği gibi), ancak ana bilgisayar uygulamaları App.Config dosyamda hala eski Service sınıfı adını kullanıyordum . (aşağıdaki ön bilgide yapılandırma bölümünün ad alanına bakın)

İşte kod pasajı,

 ServiceHost myServiceHost = new ServiceHost(typeof(NewServiceClassName)); 

ve bölüm hizmetleri altındaki App.config dosyasında eski hizmet sınıfı adına başvuruyordum, bunu benim için Yeni ServiceClassName sorunu düzeltildi olarak değiştiriyordum.

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

Burada aynı. Sınıfımın ve sözleşme adımın büyük harf kullanımını değiştirdim ve her şey işe yaradı. Teşekkürler.
Chazaq

3

Ben de aynı sorunu yaşadım. Her şey VS2010'da çalışıyor ancak aynı projeyi VS2008'de çalıştırdığımda belirtilen istisnayı alıyorum.

VS2008 projemde çalışmasını sağlamak için yaptığım şey, AddServiceEndpoint yaptığım şey ServiceHost nesnemin üyesine .

İşte kod pasajım:

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();

App.config dosyasını değiştirmedim. Ancak sanırım hizmet uç noktası .config dosyasına da eklenmiş olabilir.


Bu yöntemi kullandığımda, bu adresi addServiceReferance adresi için kullanabilsem de AddressAccessDeniedException alıyorum.
ZoomVirus

2

Hizmetimde bu sorunu çözdüm. İşte aldığım hata:

'EmailSender.Wcf.EmailService' hizmetinin sıfır uygulama (altyapı dışı) uç noktası var. Bunun nedeni, uygulamanız için hiçbir yapılandırma dosyasının bulunmaması veya yapılandırma dosyasında hizmet adıyla eşleşen hiçbir hizmet öğesinin bulunamaması veya hizmet öğesinde hiçbir uç noktanın tanımlanmamış olması olabilir.

İşte düzeltmek için kullandığım iki adım:

  1. Doğru, tam nitelikli sınıf adını kullanın:

    <service behaviorConfiguration="DefaultBehavior" name="EmailSender.Wcf.EmailService">
    
  2. MexHttpBinding ile bir uç noktayı etkinleştirin ve en önemlisi, IMetadataExchange sözleşmesini kullanın:

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

2

Bu hata, WCF hizmetinizin barındırma uygulamasının yapılandırma dosyası doğru yapılandırmaya sahip değilse ortaya çıkar.

Yapılandırmadan gelen bu yorumu hatırlayın:

Hizmet kitaplığı projesini dağıtırken, yapılandırma dosyasının içeriği ana bilgisayarın app.config dosyasına eklenmelidir. System.Configuration, kitaplıklar için yapılandırma dosyalarını desteklemez.

IIS'de barındırılan bir WCF Hizmetiniz varsa, VS.NET aracılığıyla çalışma zamanı sırasında, hizmet kitaplığı projesinin app.config dosyasını okur, ancak dağıtıldıktan sonra ana bilgisayarın web.config dosyasını okur. Web.config aynı <system.serviceModel>yapılandırmaya sahip değilse, bu hatayı alırsınız. Yapılandırmayı mükemmelleştirdikten sonra app.config'den kopyaladığınızdan emin olun.


2

Bu sorunla karşılaştım ve açık olan hiçbir şeyi kaçırmadığımdan emin olmak için yukarıdaki yanıtların tümünü kontrol ettim. Yarı bariz bir sorunum vardı. Koddaki sınıf adımın büyük / küçük harf durumu ile yapılandırma dosyasında kullandığım sınıf adı eşleşmedi.

Örneğin: sınıf adı CalculatorService ise ve konfigürasyon dosyası Calculatorservice'e atıfta bulunuyorsa ... bu hatayı alırsınız.


Aynı şeyi yaşadım. Özellikle büyük kod tabanlarını yeniden düzenlerken bulmak zor olabilir. Bir şeyleri hareket ettirirken WCF yapılandırmasında ad alanlarını güncellemeyi unutmayın.
Arve Systad

2

Visual Studio'yu Yönetici modunda çalıştırdım ve benim için çalıştı :) Ayrıca, WCF yapılandırmasını yazmak için kullandığınız app.config dosyasının gerçek WCF hizmetinde değil, "ServiceHost" sınıfının kullanıldığı projede olduğundan emin olun proje.


Bu bana çok zaman kazandırdı. :)
Parag

1

Benim sorunum, .svc dosyası için varsayılan Service1 sınıfımı daha anlamlı bir adla yeniden adlandırdığımda, web.config behaviourConfiguration ve bitiş noktasının eski adlandırma kurallarına karşılık gelmesine neden oldu. Web.config dosyanızı düzeltmeyi deneyin.


1

WCF hizmetini barındırmak için bir Konsol uygulamasıyla çalışanlar için hatırlanması gereken önemli bir nokta, WCF projesindeki Web.config dosyasının tamamen yok sayılmasıdır. Senin Eğer system.serviceModelyapılandırma varsa, o zaman için yapılandırma o bölümünü taşımak gerekir App.config sizin Konsol projesi.

Bu, ad alanının doğru yerlerde belirtilmesini sağlamaya ilişkin yanıtlara ek olarak verilmektedir.


1

Başka bir ipucu olarak, bu gerçekten benim durumumda bu sorunu çözdü.

Azure'da yayımlamak için bazı WCF hizmetlerini bir konsol uygulamasından (birkaç WCF hizmetini kodda yapılandıran) bir Azure WebRole'a geçiriyorum. Her yeni servis eklediğimde VS web.config'imi düzenler ve şu satırı ekler:

<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true">

Eh, yukarıdaki tüm tavsiye ve cevaplarla, serviceHostingEnvironment öğesindeki tüm öznitelikleri kaldırana kadar çalışmasını sağlayamadım. Gördüğünüz gibi ben bir WCF rock yıldızı değilim, ancak şu şekilde yapılandırarak ilk Servisle çalışmasını sağladım:

<service name="FirstService" behaviorConfiguration="metadataBehavior">
                <endpoint address=""
                 binding="wsHttpBinding"
                 bindingConfiguration="WSHttpBinding_WcfServicesBinding"
                 contract="IFirstService" />

            </service>

ama ikinci Servisi eklediğimde çalışmayı durdurdu ve o özniteliklerin yine orada olduğunu fark ettim.

Umarım size zaman kazandırır.


0

Bu hatayı, oluşturduğum WCF Hizmet Kitaplığım barındırma için bağlı olmadığında, ancak bağlantı için bağlandığında bir Windows Hizmetinde aldım. Bir uç nokta eksikti. (Windows Hizmetimde hem bağlantı hem de barındırma istedim, böylece WCF Hizmetini diğer bağlantılara sunabilmenin yanı sıra Windows Hizmetimin ana işleminin bir zamanlayıcı / zamanlama üzerinde çeşitli görevleri yapmak için onu kullanmasını sağladım.)

Düzeltme, App.config dosyamı doğru seçip WCF Yapılandırmasını Düzenle'yi seçmemdi. Ardından, WCF Hizmetime bağlanabilmem için Create Service adımlarını yaptım. Şimdi App.config'imde sadece bir değil iki uç noktam vardı. Bir uç nokta WCF Hizmet Kitaplığı'na bağlantı için, diğeri ise barındırmak içindi.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.