it-swarm.com.de

Der Service verfügt über keine Anwendungspunkte (keine Infrastruktur)

Ich habe vor kurzem einen WCF-Dienst (DLL) und einen Diensthost (Exe) erstellt. Ich weiß, dass mein WCF-Dienst ordnungsgemäß funktioniert, da ich den Dienst erfolgreich zu WcfTestClient hinzufügen kann. 

Ich scheine jedoch auf ein Problem zu stoßen, wenn ich meine WCF von einem Service-Host (exe) aus nutzen möchte. Ich kann meinem Service Host (exe) einen Verweis auf die WCF (dll) hinzufügen und die erforderlichen Komponenten für die exe erstellen; B. das Dienstinstallationsprogramm, den Diensthost und die app.config, kompilieren Sie das Exe und installieren Sie es schließlich mit InstallUtil. Wenn ich jedoch versuchte, den Dienst in der Microsoft Management Console zu starten, wird der Dienst nach dem Start sofort angehalten. 

Also fing ich an zu untersuchen, was genau dieses Problem verursachen könnte, und kam im Anwendungsprotokoll in der Ereignisanzeige auf diesen Fehler. 

Beschreibung: 

Dienst kann nicht gestartet werden . System.InvalidOperationException: Dienst 'Dienst' hat keine Anwendung (Nicht-Infrastruktur) Endpunkte. Diese Möglicherweise liegt keine Konfigurationsdatei vor wurde für Ihre Anwendung gefunden, oder weil kein Serviceelement mit .__ übereinstimmt. Den Dienstnamen finden Sie in der Konfigurationsdatei oder weil nein Endpunkte wurden im Service definiert Element.

Dieser Fehler wird tatsächlich in der OnStart generiert. von meinem exe, wenn ich diesen Aufruf ServiceHost.Open() durchführe. Ich habe zahlreiche Beiträge gesehen, bei denen andere Personen auf dieses Problem gestoßen sind, die meisten, wenn nicht alle, behaupten jedoch, dass der Dienstname oder der Vertrag genannt wird. Namespace und Klassenname werden nicht angegeben. Ich habe beide Einträge in meiner Konfigurationsdatei überprüft. sowohl in der exe als auch in der dll, und sie passen perfekt zusammen. Ich hatte andere Leute im Büro, die hinter mir waren, um sicherzugehen, dass ich nicht blind wurde, aber natürlich kamen sie zu der gleichen Schlussfolgerung wie ich, dass alles so aussah, als sei es richtig spezifiziert worden. Ich weiß wirklich nicht, was an diesem Punkt vor sich geht. Kann mir jemand bei diesem Problem helfen? 

Eine andere Sache, die als möglicher Grund für dieses Ereignis auftauchte, ist, dass die app.config nie gelesen wird. Zumindest nicht die, die ich denke, sollte gelesen werden. Könnte dies das Problem sein? Wenn ja, wie kann ich dieses Problem angehen? JEDE Hilfe wäre dankbar. 

85
user280626

Ich hatte gerade dieses Problem und löste es, indem ich dem Servicenamen den Namespace hinzufügte, z.

 <service name="TechResponse">

wurden

 <service name="SvcClient.TechResponse">

Ich habe es auch mit einer Web.config anstelle einer App.config gelöst.

90
SteveCav

Der Endpunkt sollte auch den Namespace haben:

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

Kopieren Sie einfach die Datei "App.config" aus dem Dienstprojekt in die Konsole-Hostanwendung, fügen Sie sie hier ein und löschen Sie sie aus dem Dienstprojekt.

9
usufhamad

Zu bedenken ist: Haben Sie Ihre WCF vollständig vom WindowsService (WS) abgekoppelt? Ein WS ist schmerzhaft, weil Sie nicht viel Kontrolle oder Sichtbarkeit haben. Ich versuche dies zu mildern, indem ich alle meine Nicht-WS-Sachen in ihren eigenen Klassen habe, damit sie unabhängig von der Host-WS getestet werden können. Wenn Sie diesen Ansatz verwenden, können Sie möglicherweise alles, was mit der WS-Laufzeit passiert, im Vergleich zu Ihrem Service beseitigen.

John ist wahrscheinlich richtig, dass es sich um ein .config-Problem handelt. WCF sucht immer nach dem Ausführungskontext .config . Wenn Sie also Ihre WCF in verschiedenen Ausführungskontexten hosten (dh mit einer Konsolenanwendung testen und mit einem WS bereitstellen), müssen Sie sicherstellen, dass die WCF-Konfigurationsdaten in die richtige .config-Datei verschoben werden. Aber das Problem liegt mir darin, dass Sie nicht wissen, was das Problem ist, weil der WS-Schwarm im Weg ist. Wenn Sie das noch nicht überarbeitet haben, damit Sie Ihren Dienst in einem beliebigen Kontext ausführen können (z. B. einem Gerätetest oder einer Konsole), würde ich dies vorschlagen. Wenn Sie Ihren Dienst in einem Komponententest hochgefahren haben, schlägt dies wahrscheinlich auf die gleiche Weise fehl, wie Sie es mit dem WS sehen. Dies ist viel einfacher zu debuggen als mit den glücklichen WS-Installationen.

8
Kevin Won

Ich habe eine detailliertere Ausnahme erhalten, als ich sie programmgesteuert hinzugefügt habe - 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();
4
Lijo

Die Konfiguration für WCF vorzubereiten ist schwierig, und manchmal wird eine Servicetypdefinition nicht bemerkt.

Ich habe nur den Namespace in das Service-Tag geschrieben, daher habe ich den gleichen Fehler erhalten.

<service name="ServiceNameSpace">

Vergessen Sie nicht, dass das Service-Tag einen vollständig qualifizierten Namen der Serviceklasse benötigt.

<service name="ServiceNameSpace.ServiceClass">

Für die anderen Leute, die wie ich sind.

4
Uğur Aldanmaz

Heute bin ich auf dieselbe Ausgabe gestoßen und habe meinen Fehler hier veröffentlicht und korrigiert, damit er jemandem helfen kann.

Während der Umstrukturierung von Code hatte ich die Namen der Service-Klassen und IService tatsächlich geändert und ServiceHost so geändert, dass es auf diesen neuen Service-Klassennamen verweist (wie im Code-Snippet gezeigt). In der App.Config-Datei der Hostanwendungen verwendete ich jedoch noch den alten Namen der Service-Klasse (siehe Namensfeld des Konfigurationsabschnitts unter dem Ausschnitt)

Hier ist der Code-Ausschnitt,

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

und in der App.config-Datei unter Abschnitt services bezog ich mich auf den alten Namen der Serviceklasse und änderte ihn in das Problem Neues ServiceClassName für mich.

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

Ich hatte das gleiche Problem. Alles funktioniert in VS2010, aber wenn ich dasselbe Projekt in VS2008 starte, erhalte ich die erwähnte Ausnahme.

Was ich in meinem VS2008-Projekt getan habe, damit es funktioniert, fügte dem AddServiceEndpoint-Member meines ServiceHost-Objekts einen Aufruf hinzu.

Hier ist mein Code-Snippet:

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

Ich habe die app.config-Datei nicht geändert. Aber ich denke, der Service-Endpunkt könnte auch in der .config-Datei hinzugefügt worden sein.

Dieser Fehler tritt auf, wenn die Konfigurationsdatei der Hostanwendung Ihres WCF-Dienstes nicht die richtige Konfiguration hat. 

Merken Sie sich diesen Kommentar aus der Konfiguration: 

Beim Bereitstellen des Dienstbibliotheksprojekts wird der Inhalt der config Die Datei muss der app.config-Datei des Hosts hinzugefügt werden. Systemkonfiguration unterstützt keine Konfigurationsdateien für Bibliotheken.

Wenn Sie einen WCF-Dienst in IIS gehostet haben, liest er zur Laufzeit über VS.NET die app.config des Dienstbibliotheksprojekts, liest jedoch nach der Bereitstellung die web.config des Hosts. Wenn web.config nicht die identische <system.serviceModel>-Konfiguration hat, wird diese Fehlermeldung angezeigt. Stellen Sie sicher, dass Sie die Konfiguration von app.config nach der Perfektionierung übernehmen.

2
atconway

Ich habe dieses Problem gerade in meinem Dienst durchgearbeitet. Hier ist der Fehler, den ich erhalten habe:

Der Dienst 'EmailSender.Wcf.EmailService' hat keine Endpunkte für Anwendungen (keine Infrastruktur). Dies kann daran liegen, dass für Ihre Anwendung keine Konfigurationsdatei gefunden wurde, oder dass kein mit dem Servicenamen übereinstimmendes Serviceelement in der Konfigurationsdatei gefunden wurde oder weil im Serviceelement keine Endpunkte definiert wurden.

Hier sind die zwei Schritte, mit denen ich das Problem behoben habe:

  1. Verwenden Sie den richtigen vollständig qualifizierten Klassennamen:

    <service behaviorConfiguration="DefaultBehavior" name="EmailSender.Wcf.EmailService">
    
  2. Aktivieren Sie einen Endpunkt mit mexHttpBinding und verwenden Sie vor allem den IMetadataExchange-Vertrag:

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

Als weiterer Hinweis wurde das Problem in meinem Fall behoben. 

Ich migriere einige WCF-Services von einer Konsolenanwendung (die im Code mit wenigen WCF-Services konfiguriert ist) zu einer Azure-WebRole, um sie in Azure zu veröffentlichen. Jedes Mal, wenn ich einen neuen Dienst hinzufüge, bearbeitet VS meine web.config und fügt diese Zeile hinzu:

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

Nun, mit all den oben genannten Ratschlägen und Antworten konnte ich es nicht schaffen, bis ich alle Attribute im Element serviceHostingEnvironment entfernt habe. Wie Sie sehen, bin ich kein WCF-Rockstar, aber ich habe es mit dem ersten Dienst gemacht, indem ich ihn so konfiguriert habe:

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

            </service>

als ich jedoch den zweiten Service hinzufügte, hörte er auf zu funktionieren und ich merkte, dass diese Attribute wieder vorhanden waren.

Ich hoffe es spart Zeit.

1
Juan

Mein Problem war, als ich meine Standard-Service1-Klasse für die .svc-Datei in einen aussagekräftigeren Namen umbenannt habe, wodurch die Verhaltenskonfiguration von web.config und der Endpunkt der alten Namenskonvention entsprachen. Versuchen Sie, Ihre web.config zu reparieren.

1
Michael

Ich bin gerade auf dieses Thema gestoßen und habe alle obigen Antworten geprüft, um sicherzustellen, dass ich nichts offensichtliches vermisst. Nun, ich hatte ein halb offensichtliches Problem. Mein Gehäuse meines Klassennamens im Code und der Klassenname, die ich in der Konfigurationsdatei verwendete, stimmen nicht überein.

Beispiel: Wenn der Klassenname CalculatorService Lautet und die Konfigurationsdatei auf Calculatorservice ... Verweist, wird diese Fehlermeldung angezeigt.

1

Für alle, die mit einer Konsolenanwendung arbeiten, um den WCF-Dienst zu hosten, ist zu beachten, dass die Datei Web.config im WCF-Projekt vollständig ignoriert wird. Wenn Ihre system.serviceModel-Konfiguration vorhanden ist, müssen Sie diesen Konfigurationsabschnitt in die Datei App.config Ihres Console-Projekts verschieben.

Dies gilt zusätzlich zu den Antworten, die sicherstellen, dass der Namespace an den richtigen Stellen angegeben wird.

1
Neo

Ich habe Visual Studio im Administratormodus ausgeführt, und es funktionierte für mich:) Stellen Sie außerdem sicher, dass die Datei app.config, die Sie zum Schreiben der WCF-Konfiguration verwenden, sich in dem Projekt befinden muss, in dem die Klasse "ServiceHost" verwendet wird, und nicht in tatsächliches WCF-Serviceprojekt.

1
DfrDkn

Ich hatte diesen Fehler in einem Windows-Dienst, als meine von mir erstellte WCF-Dienstbibliothek nicht für das Hosting verbunden war, sondern für die Verbindung. Ich habe einen Endpunkt vermisst. (Ich wollte sowohl Verbindung als auch Hosting in meinem Windows-Dienst, damit ich den WCF-Dienst für andere Verbindungen bereitstellen kann. Außerdem sollte der Hauptprozess meines Windows-Dienstes dazu dienen, verschiedene Aufgaben nach einem Zeitgeber/Zeitplan auszuführen.)

Das Problem war, dass ich meine App.config-Datei mit der rechten Maustaste geklickt und WCF-Konfiguration bearbeiten ausgewählt habe. Dann habe ich die Schritte für Create Service ausgeführt, damit ich mich mit meinem WCF-Service verbinden kann. Jetzt hatte ich zwei Endpunkte in meiner App.config, nicht nur einen. Ein Endpunkt war für die Verbindung zur WCF-Servicebibliothek und ein anderer für das Hosting.

0
Volomike