Il servizio ha zero endpoint applicativi (non infrastrutturali)


91

Di recente ho creato un servizio WCF (dll) e un host di servizio (exe). So che il mio servizio WCF funziona correttamente poiché sono in grado di aggiungere correttamente il servizio a WcfTestClient.

Tuttavia, mi sembra di incorrere in un problema quando si tratta di utilizzare il mio WCF da un host di servizio (exe). Posso aggiungere un riferimento al WCF (dll) al mio host di servizio (exe) e creare i componenti necessari per l'exe; come il programma di installazione del servizio, l'host del servizio e app.config, compilare e infine installare l'exe utilizzando InstallUtil. Tuttavia, quando ho provato ad avviare il servizio in Microsoft Management Console, il servizio si interrompe immediatamente dopo essere stato avviato.

Quindi ho iniziato a indagare su cosa potesse causare esattamente questo problema e ho riscontrato questo errore dal registro dell'applicazione nel Visualizzatore eventi.

Descrizione:

Il servizio non può essere avviato. System.InvalidOperationException: il servizio "Service" non ha endpoint dell'applicazione (non infrastrutturale). Ciò potrebbe essere dovuto al fatto che non è stato trovato alcun file di configurazione per l'applicazione o perché non è stato possibile trovare alcun elemento del servizio corrispondente al nome del servizio nel file di configurazione o perché non sono stati definiti endpoint nell'elemento del servizio.

Questo errore viene effettivamente generato in OnStart; del mio exe, quando eseguo questa chiamata ServiceHost.Open(). Ho visto numerosi post in cui altre persone si sono imbattute in questo problema, tuttavia la maggior parte, se non tutte, afferma che il nome del servizio o il contratto; spazio dei nomi e nome della classe, non vengono specificati. Ho controllato entrambe queste voci nel mio file di configurazione; nell'exe così come nel dll, e corrispondono PERFETTAMENTE. Ho avuto altre persone in ufficio a ricontrollare dietro di me per assicurarmi che non fossi diventato cieco a un certo punto, ma ovviamente sono giunti alla mia stessa conclusione che tutto sembrava essere stato specificato correttamente. Sono veramente perso su quello che sta succedendo a questo punto. Qualcuno potrebbe aiutarmi con questo problema?

Un'altra cosa che è emersa come una possibile ragione per cui ciò potrebbe accadere è che app.config non viene mai letto; almeno non quello che penso dovrebbe essere letto. Potrebbe essere questo il problema? In tal caso, come posso affrontare il problema. Ancora una volta, QUALSIASI aiuto sarebbe apprezzato.


2
La definizione del contratto di servizio deve essere copiata da service.dll.config a service.exe.config.
John Saunders

1
puoi mostrarci l'app.config del servizio ?? Fai qualcosa di speciale nel servizio NT per istanziare / aprire ServiceHost?
marc_s

Risposte:


93

Ho appena avuto questo problema e l'ho risolto aggiungendo lo spazio dei nomi al nome del servizio, ad es

 <service name="TechResponse">

divenne

 <service name="SvcClient.TechResponse">

Ho anche visto che si è risolto con un Web.config invece di un App.config.


Sì, abbiamo cambiato gli spazi dei nomi in modo che non riuscisse a trovare il servizio in modo che corrispondesse a quello nel file .svc (un trattino basso è stato sostituito da un punto!) Un rapido controllo dei nomi dei servizi ha rivelato cosa stava succedendo.

1
Ha risolto anche il mio problema, adoro queste soluzioni facili e veloci!
vfilby

L'aggiunta di un file web.config mi ha aiutato a risolvere questo errore.
Ryan Rodemoyer

2
Questo ha risolto il mio problema !!! Molte grazie! Per tutti i neofiti come me: suggerisci questo tutorial davvero chiaro: lourenco.co.za/blog/2013/08/…
Homer1982

12

L'endpoint dovrebbe anche avere lo spazio dei nomi:

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

Ho questo in app.config ma voglio cambiarlo nel codice senza rimuoverlo da app.config. L'utilizzo del nuovo ServiceHost con un nuovo indirizzo endpoint restituisce un errore.
Paul McCarthy,

9

Una cosa a cui pensare è: hai il tuo WCF completamente scollegato da WindowsService (WS)? Un WS è doloroso perché non hai molto controllo o visibilità su di loro. Cerco di mitigare questo problema avendo tutte le mie cose non WS nelle loro classi in modo che possano essere testate indipendentemente dal WS host. L'uso di questo approccio potrebbe aiutarti a eliminare tutto ciò che sta accadendo con il runtime WS rispetto al tuo servizio in particolare.

John probabilmente ha ragione sul fatto che si tratta di un problema di file .config. WCF cercherà sempre il contesto di esecuzione .config . Quindi, se stai ospitando il tuo WCF in diversi contesti di esecuzione (ovvero, test con un'applicazione console e distribuisci con un WS), devi assicurarti di avere i dati di configurazione WCF spostati nel file .config appropriato. Ma il problema di fondo per me è che non sai quale sia il problema perché la sostanza appiccicosa WS si intromette. Se non hai ancora effettuato il refactoring in modo da poter eseguire il tuo servizio in qualsiasi contesto (ovvero, unit test o console), allora ti suggerisco di farlo. Se aumenti il ​​tuo servizio in uno unit test, probabilmente fallirà nello stesso modo in cui stai vedendo con il WS che è molto più facile da eseguire il debug piuttosto che tentare di farlo con lo schifoso impianto idraulico WS.


1
Grazie per aver risposto così rapidamente. Ho copiato il mio app.config dal mio WCF (dll), quindi non credo che sia questo il problema. Ma trovo solo strano che io sia in grado di portare il mio WCF (dll) utilizzando WcfTestclient.exe senza problemi. Mi sembra che se qualcosa fosse una nebbia con il file di configurazione avrebbe dovuto fallire anche lì, non solo quando provo a eseguirlo in un host del servizio Windows (exe). Mi scuso se sembro un po 'perso, purtroppo sono ancora un principiante alla WCF e al periodo dei servizi. Qualche altro suggerimento?
user280626

9

Basta copiare il file App.config dal progetto di servizio all'applicazione host della console e incollarlo qui, quindi eliminarlo dal progetto di servizio.


5

Ho ricevuto un'eccezione più dettagliata quando l'ho aggiunta a livello di codice - 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
Grazie! passare l'indirizzo in questo modo mi ha mostrato maggiori dettagli sull'eccezione. Nel mio caso è stato semplicemente che la porta è stata utilizzata da un altro processo :)
Hernan Veiras

Ho lo stesso problema: l'indirizzo di base è lo stesso dell'indirizzo quando fai clic su Scopri nel Aggiungi riferimento al servizio?
ZoomVirus

4

Preparare la configurazione per WCF è difficile e talvolta la definizione di un tipo di servizio passa inosservata.

Ho scritto solo lo spazio dei nomi nel tag di servizio, quindi ho ricevuto lo stesso errore.

<service name="ServiceNameSpace">

Non dimenticare che il codice di matricola richiede un nome di classe di servizio completo.

<service name="ServiceNameSpace.ServiceClass">

Per le altre persone che sono come me.


1
Vuoi dire come ho risposto qui quattro anni prima?
SteveCav

Sembrano uguali ma c'è una differenza. Il tuo esempio sbagliato riguarda la scrittura solo del nome della classe ( TechResponse), ma il mio sta scrivendo solo lo spazio dei nomi ( ServiceNameSpace).
Uğur Aldanmaz

4

Oggi mi sono imbattuto nello stesso problema, postando qui il mio errore e correggendolo in modo che potesse aiutare qualcuno.

Durante la ristrutturazione del codice, avevo effettivamente cambiato la classe di servizio e i nomi di IService e ho cambiato ServiceHost in modo che puntasse a questo nuovo nome di classe di servizio (come mostrato nello snippet di codice) ma nel file App.Config delle mie applicazioni host stavo ancora usando il vecchio nome di classe di servizio . (fare riferimento al campo del nome della sezione di configurazione nello snippet sottostante)

Ecco lo snippet di codice,

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

e nel file App.config nella sezione servizi mi riferivo al vecchio nome serviceclass, cambiandolo in New ServiceClassName problema risolto per me.

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

Anch'io. Ho cambiato le lettere maiuscole della classe e il nome del contratto e tutto ha funzionato. Grazie.
Chazaq

3

Ho avuto lo stesso problema. Tutto funziona in VS2010 ma quando eseguo lo stesso progetto in VS2008 ottengo l'eccezione menzionata.

Quello che ho fatto nel mio progetto VS2008 per farlo funzionare è stato l'aggiunta di una chiamata al AddServiceEndpointmembro del mio oggetto ServiceHost.

Ecco il mio frammento di codice:

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

Non ho modificato il file app.config. Ma immagino che anche l'endpoint del servizio potrebbe essere stato aggiunto nel file .config.


Quando utilizzo questo metodo ottengo AddressAccessDeniedException anche se posso utilizzare questo indirizzo per l'indirizzo addServiceReferance.
ZoomVirus

2

Ho appena risolto questo problema sul mio servizio. Ecco l'errore che stavo ricevendo:

Il servizio "EmailSender.Wcf.EmailService" ha zero endpoint applicativi (non infrastrutturali). Ciò potrebbe essere dovuto al fatto che non è stato trovato alcun file di configurazione per l'applicazione o perché non è stato possibile trovare alcun elemento del servizio corrispondente al nome del servizio nel file di configurazione o perché non sono stati definiti endpoint nell'elemento del servizio.

Ecco i due passaggi che ho usato per risolverlo:

  1. Utilizza il nome di classe completo corretto:

    <service behaviorConfiguration="DefaultBehavior" name="EmailSender.Wcf.EmailService">
  2. Abilita un endpoint con mexHttpBinding e, soprattutto, usa il contratto IMetadataExchange:

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

2

Questo errore si verificherà se il file di configurazione dell'applicazione di hosting del servizio WCF non ha la configurazione corretta.

Ricorda questo commento dalla configurazione:

Quando si distribuisce il progetto della libreria di servizio, il contenuto del file di configurazione deve essere aggiunto al file app.config dell'host. System.Configuration non supporta i file di configurazione per le librerie.

Se si dispone di un servizio WCF ospitato in IIS, durante il runtime tramite VS.NET leggerà l'app.config del progetto di libreria del servizio, ma leggerà il file web.config dell'host una volta distribuito. Se web.config non ha la stessa <system.serviceModel>configurazione riceverai questo errore. Assicurati di copiare la configurazione da app.config una volta che è stato perfezionato.


2

Mi sono imbattuto in questo problema e ho controllato tutte le risposte sopra per assicurarmi che non mi mancasse nulla di ovvio. Bene, ho avuto un problema semi-ovvio. Il mio nome di classe nel codice e il nome di classe che ho usato nel file di configurazione non corrispondevano.

Ad esempio: se il nome della classe è CalculatorService e il file di configurazione fa riferimento a Calculatorervice ... riceverai questo errore.


Ho appena sperimentato la stessa cosa. Può essere difficile da trovare, specialmente durante il refactoring di basi di codice di grandi dimensioni. Ricordarsi di aggiornare gli spazi dei nomi nella configurazione WCF quando si spostano le cose.
Arve Systad

2

Ho eseguito Visual Studio in modalità amministratore e ha funzionato per me :) Inoltre, assicurati che il file app.config che stai utilizzando per scrivere la configurazione WCF deve essere nel progetto in cui viene utilizzata la classe "ServiceHost" e non nel servizio WCF effettivo progetto.


Questo mi ha fatto risparmiare molto tempo. :)
Parag

1

Il mio problema è stato quando ho rinominato la mia classe Service1 predefinita per il file .svc con un nome più significativo, il che ha fatto sì che web.config behaviorConfiguration e l'endpoint corrispondessero alla vecchia convenzione di denominazione. Prova a correggere il tuo file web.config.


1

Una cosa fondamentale da ricordare per coloro che lavorano con un'applicazione console per ospitare il servizio WCF è che il file Web.config nel progetto WCF viene completamente ignorato. Se la tua system.serviceModelconfigurazione è presente, devi spostare quella sezione di config in App.config del tuo progetto Console.

Questo è in aggiunta alle risposte riguardanti la garanzia che lo spazio dei nomi sia specificato nei posti giusti.


1

Come un altro indizio, questo ha effettivamente risolto questo problema nel mio caso.

Sto migrando alcuni servizi WCF da un'applicazione console (che configura in codice pochi servizi WCF) a un ruolo Web di Azure per pubblicarli in Azure. Ogni volta che aggiungo un nuovo servizio, VS modifica il mio web.config e aggiunge questa riga:

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

Bene, con tutti i consigli e le risposte sopra non ho potuto farlo funzionare fino a quando non ho rimosso tutti gli attributi nell'elemento serviceHostingEnvironment. Come puoi vedere non sono una rockstar WCF ma l'ho fatto funzionare con il primo servizio semplicemente configurandolo come:

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

            </service>

ma quando ho aggiunto il secondo servizio ha smesso di funzionare e mi sono reso conto che quegli attributi erano di nuovo lì.

Spero che ti faccia risparmiare tempo.


0

Ho riscontrato questo errore in un servizio Windows quando la mia libreria di servizi WCF che ho creato non era connessa per l'hosting, ma era connessa per la connessione. Mi mancava un punto finale. (Volevo sia la connessione che l'hosting nel mio servizio Windows in modo da poter servire il servizio WCF ad altre connessioni, oltre che il processo principale del mio servizio Windows lo usasse per svolgere varie attività su un timer / pianificazione.)

La soluzione è stata che ho selezionato con il tasto destro il mio file App.config e ho scelto Modifica configurazione WCF. Quindi, ho eseguito i passaggi per Crea servizio in modo da potermi connettere al mio servizio WCF. Ora avevo due endpoint nel mio App.config, non solo uno. Un endpoint era per la connessione alla libreria di servizi WCF e un altro per l'hosting.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.