WCF, Dienstattributwert in der ServiceHost-Direktive wurde nicht gefunden


74

Ich versuche, meinen Dienst mit IIS 6 zu hosten, erhalte jedoch weiterhin diese Ausnahme.

    Server Error in '/WebServices' Application.
--------------------------------------------------------------------------------

The type 'QS.DialogManager.Communication.IISHost.RecipientService', provided as the Service attribute value in the ServiceHost directive could not be found. 
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.InvalidOperationException: The type 'QS.DialogManager.Communication.IISHost.RecipientService', provided as the Service attribute value in the ServiceHost directive could not be found.

Source Error: 

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.  

Stack Trace: 


[InvalidOperationException: The type 'QS.DialogManager.Communication.IISHost.RecipientService', provided as the Service attribute value in the ServiceHost directive could not be found.]
   System.ServiceModel.Activation.ServiceHostFactory.CreateServiceHost(String constructorString, Uri[] baseAddresses) +6714599
   System.ServiceModel.HostingManager.CreateService(String normalizedVirtualPath) +604
   System.ServiceModel.HostingManager.ActivateService(String normalizedVirtualPath) +46
   System.ServiceModel.HostingManager.EnsureServiceAvailable(String normalizedVirtualPath) +654

[ServiceActivationException: The service '/WebServices/dm/RecipientService.svc' cannot be activated due to an exception during compilation.  The exception message is: The type 'QS.DialogManager.Communication.IISHost.RecipientService', provided as the Service attribute value in the ServiceHost directive could not be found..]
   System.ServiceModel.AsyncResult.End(IAsyncResult result) +15626880
   System.ServiceModel.Activation.HostedHttpRequestAsyncResult.End(IAsyncResult result) +15546921
   System.ServiceModel.Activation.HostedHttpRequestAsyncResult.ExecuteSynchronous(HttpApplication context, Boolean flowContext) +265
   System.ServiceModel.Activation.HttpModule.ProcessRequest(Object sender, EventArgs e) +227
   System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +80
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +171




--------------------------------------------------------------------------------
Version Information: Microsoft .NET Framework Version:2.0.50727.3082; ASP.NET Version:2.0.50727.3082 

Ich habe absolut keine Ahnung, außer dass es so aussieht, als ob es meine Baugruppen nicht finden kann. Der Code sollte mit öffentlichen Klassen korrekt kompiliert werden.

Hier ist meine .svc-Datei:

<%@ ServiceHost Language="C#" Debug="true" Service="QS.DialogManager.Communication.IISHost.RecipientService" CodeBehind="RecipientService.svc.cs" %>

Ich habe versucht, einen sehr sehr einfachen Dienst zu erstellen, der nur nichts enthält, um zu sehen, ob dies funktionieren würde, aber immer noch der gleiche alte Fehler auftritt.

The type 'IISHost.Service1', provided as the Service attribute value in the ServiceHost directive could not be found. 

Können Sie Inhalte von service.svc anzeigen?
Konstantin Tarkus

1
Wenn es auf einen vorkompilierten Typ in einer Assembly verweist, haben Sie es in das bin-Verzeichnis unter der vroot kopiert?
Konstantin Tarkus

2
<% @ ServiceHost Language = "C #" Debug = "true" Service = "QS.DialogManager.Communication.IISHost.RecipientService" CodeBehind = "RecipientService.svc.cs"%>
nandarya

1
Vielen Dank, dass Sie dies gepostet haben. Ihre Fragen und Antworten haben das gleiche Problem für mich behoben.
Pauk

Kommentar, da ich anscheinend nicht speichern kann ...
Joshua Drake

Antworten:


66

Option Eins :

Diese Meldung ist häufig auf ein IIS 7-Konfigurationsproblem zurückzuführen. Wenn Sie es gewohnt sind, ein virtuelles Verzeichnis zu erstellen, das auf den Ordner verweist, in dem sich Ihr Dienst befindet, funktioniert dies nicht mehr. Jetzt müssen Sie stattdessen die Option "Anwendung erstellen ..." verwenden.

Andere Optionen :


1
Wo finde ich diese Option in IIS 6?
Nandarya

2
Stellen Sie sicher, dass der virtuelle Ordner in IIS6 eine Webanwendung ist
Konstantin Tarkus

2
Haben Sie es in das bin-Verzeichnis unter der Vroot kopiert?
Konstantin Tarkus

4
Ja, jetzt funktioniert es! Ich habe Sie zuvor missverstanden und das Problem gelöst, den Unterordner zu einer virtuellen App zu machen. Danke vielmals!
Nandarya

3
In meinem Fall stellte sich heraus, dass die Projektausgabe außerhalb des Website-Ordners lag (behoben durch Ändern des Ausgabeordners in 'bin \')
Pavel Shkleinik

72

Das Problem könnte auch ein anderer Namespace in der SVC-Datei sein als in der SVCC-Datei.

In SVC-Dateien muss der Namespace das folgende Format haben.

Service="Namespace.SvcClassName"

1
Dies ist insbesondere in VS Express üblich, das keine Refactoring-Unterstützung bietet und in der IDE den Inhalt der SVC-Datei nicht einfach anzeigt.
Chriseyre2000

2
Das war mein genaues Problem. Ich ging meine Lösung durch und trennte die Namespaces zwischen den beiden Projekten innerhalb der Lösung und vergaß, die .svc-Referenz zu aktualisieren.
Nip

2
Sie haben es verstanden, die meisten Lehrbücher im Web platzieren einen Namensraum um den Beispiel-WCF-Dienst und die Benutzeroberfläche und dieser muss auf die Seite service.svc gebracht werden.
htm11h

2
Das hat mir geholfen. Ich habe meinen Namespace geändert, konnte aber nicht herausfinden, wie die Servicedatei (servicename.svc) in VS2010 Express geöffnet werden soll. Am Ende ging ich zum Dateisystem und öffnete die Datei direkt in Notepad ++ und bearbeitete sie dort.
Andrew MacNaughton

32

Ich weiß, dass dies wahrscheinlich die "offensichtliche" Antwort ist, aber es hat mich ein bisschen gestolpert. Stellen Sie sicher, dass sich im Ordner bin eine DLL für das Projekt befindet. Als der Dienst veröffentlicht wurde, hat der Typ, der ihn veröffentlicht hat, die DLLs gelöscht, weil er dachte, sie wären im GAC. Die speziell für das Projekt (in diesem Fall QS.DialogManager.Communication.IISHost.RecipientService.dll) war nicht vorhanden.

Gleicher Fehler aus einem ganz anderen Grund.


1
Dies scheint für mich einen Unterschied zu machen - unser Projekt gibt seine Montage an anderer Stelle aus. Das Hinzufügen von \ bin \ Debug und das Kopieren der DLL schien zu funktionieren.
Tom W

Vielen Dank. Ich habe vergessen, meine Anwendung nach einer Verzweigung zu erstellen, und habe mich gefragt, warum IIS diese Fehler ausgelöst hat. Mann, fühle ich mich nicht albern ...
Dudemanword

Danke, dass du das gepostet hast, anscheinend war es mir nicht klar.
Saumil

11

Dieser Fehler tritt aufgrund einer Nichtübereinstimmung des Dienstnamens in der SVC-Datei auf. Möglicherweise haben Sie den Namen der Serviceklasse geändert, die die Schnittstelle implementiert. Die Lösung besteht darin, die SVC-Datei zu öffnen und genau mit dem Service-Attribut und dem CodeBehind-Attribut übereinzustimmen. Ihre .SVC-Datei sollte also so aussehen

<%@ ServiceHost Language="Language you are using" Debug="bool value to enable debugging" Service="Service class name that is implementing your Service interface" Codebehind="~/Appcode/Class implementing interface.cs"%>. for eg.

<%@ ServiceHost Language="C#" Debug="true" Service="Product.Service" CodeBehind="~/AppCode/Product.Service.cs"%>

Dieses Beispiel bezieht sich auf eine SVC-Datei, die die C # -Sprache verwendet, mit aktiviertem Debugging, einer Implementierungsschnittstelle für die Serviceklasse. Diese Klasse befindet sich im App-Ordner mit dem Namen Service.cs und Product ist der Namespace für die Serviceklasse.

Bitte nehmen Sie auch entsprechende Änderungen in der Service-Konfigurationsdatei vor.

<system.serviceModel>
    <services>
        <service name="Product.Service" behaviorConfiguration="ServiceBehavior">
            <endpoint address="" binding="wsHttpBinding" contract="Product.Iservice">
            </endpoint>
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
        </service>
    </services>
    <behaviors>
        <behavior name="ServiceBehavior">
            <serviceMetaData httpGetEnabled="true"/>
            <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
    </behaviors>
</system.serviceModel>

1
Dies war mein Problem, ich habe später meine .svc-Datei in den Unterordner "Client" verschoben. In der Dienstanweisung in der .svc-Datei fehlte dieser neue Ordner / Namespace:Service="MyServicesProxy.Client.OpenClientService"
Iztoksson

Genau. Vielen Dank
Bhuwan Pandey

Beachten Sie auch, dass der Dienstname zwischen Groß- und Kleinschreibung unterscheidet! Als vb.net-Entwickler hat mich das reingelegt!
J. Hudler

9

Stellen Sie sicher, dass Sie auf den richtigen Typ aus der ServiceHost-Direktive in der SVC-Datei verweisen. Hier ist wie...

  1. Öffnen Sie im VS-Projekt, das Ihren Webdienst enthält, die SVC-Datei im XML-Editor (klicken Sie mit der rechten Maustaste auf die Datei, Öffnen mit ..., wählen Sie XML-Editor (Text), OK).
  2. Beachten Sie den Attributwert "Service".
  3. Stellen Sie sicher, dass es mit dem vollständig qualifizierten Typnamen Ihres Dienstes übereinstimmt. Dies beinhaltet den Namespace + Typnamen. Wenn der Namespace beispielsweise "MyCompany.Department.Services" lautet und die Klasse "MyService" heißt, sollte der Dienstattributwert "MyCompany.Department.Services.MyService" lauten.

Sie sollten SVC-Dateien im Webdienst-Editor öffnen (Standardeinstellung), da der XML-Editor Ihnen XML-Validierungsfehler liefert.
DanM7

7

Ich hatte die gleiche Ausnahme, dies liegt an dem Typ, der in der .svc-Datei nicht korrekt erwähnt wird

Ich habe mit unten korrigiert.

wenn Ihre .svc.cs eine solche Klasse hat

namespace Azh.Services.MyApp
{
    public class WcfApp : FI.IWcfAppService
{
...
}
}

dafür sollte die .svc-datei so aussehen

<%@ ServiceHost Language="C#" Debug="true" Service="Azh.Services.MyApp.WcfApp" CodeBehind="WcfApp.svc.cs" %>

Lebensretter! Ich hatte mein Serviceprojekt und meinen Namespace umbenannt, aber dies wurde nicht aktualisiert.
Arviman

5

Sie sollten den Pfad Ihres Bin-Ordners so konfigurieren, dass der lokale Bin gewartet wird.


1
In der Tat funktionierte das Kopieren der DLL in einen Ordner im selben Pfad wie die SVC-Datei. C:\Folder\SVC_ServiceFolder\bin. Ich musste einige doppelte Konfigurations-Tags entfernen.
Junior Mayhé

3

Wenn Sie etwas umbenannt haben, überprüfen Sie die (Eigenschaften /) AssemblyInfo.cs korrekt ist, sowie der Header in der Servicedatei.

ServiceName.svc

<%@ ServiceHost Language="C#" Debug="true" Service="Company.Namespace.WcfApp" CodeBehind="WcfApp.svc.cs" %>

Anpassen an Ihren Namespace in Ihrem Service.svc.cs


2

Ich habe praktisch das gleiche Problem gelöst. Hier ist mein Vorschlag: Der Fehler bedeutet, dass das Objekt, auf das im Service-Attribut verwiesen wird, nicht gefunden wird. Damit das Objekt gefunden werden kann, muss die Anwendung oder Bibliothek eine Ausgabe im Ordner bin erstellen.

Sie können die Eigenschaftsseite der Anwendung bearbeiten und den Ausgabepfad zu 'bin' angeben.


Ja, meine Projekteigenschaften hatten "bin \ Debug" für den Ausgabepfad - geändert in "bin \". Könnte damit zusammenhängen, dass dies eine sehr alte Projektdatei war, die jetzt in VS2017 verwendet wird.
Joanygaard

2

Ich hatte dieses Problem - mein Servicetyp war im GAC. Es würde funktionieren, wenn ich die DLL mit dem Typ zum bin-Ordner hinzufügen würde, aber da es im GAC war, war dies NICHT das, was ich wollte. Ich habe dies schließlich zur web.config für den Dienst hinzugefügt

<system.web>
    <customErrors mode="RemoteOnly" />
    <compilation debug="true" targetFramework="4.0">
        <assemblies>
            <add assembly="[name in GAC], Version=[version in GAC], Culture=neutral, PublicKeyToken=[ac token]" />
        </assemblies>
    </compilation>
</system.web>

und es funktionierte ohne DLLs im Ordner bin.


Nützliches Skript, um die qualifizierten Namen von DLLs zu erhalten: stackoverflow.com/a/17396640/681538
Alex

1

Zwei Schlüssel dazu für bestimmte Varianten des 'Service-Attributwerts in der ServiceHost-Direktive konnten nicht gefunden werden'-Problem: (1) Wenn Sie in Silverlight arbeiten, sollten Sie den Silverlight WCF-fähigen Dienst verwenden, nicht den Nicht-Dienst Silverlight WCF Service; Dadurch wird Web.Config für die Bindungen aktualisiert und der Typ wird sichtbar. (2) Ordnen Sie den Klassennamen im neuen Dienst dem Dienstnamen zu. Ziel ist es, eine WSDL zu erstellen, damit Sie wissen, dass die Funktionalität des Dienstes Ihrem Silverlight-Client und dem Web zugänglich ist. Es ist hilfreich, wenn der Service der Klasse entspricht. Wenn Sie die Namen verputzt haben, müssen Sie die Web.Config an drei Stellen bearbeiten (serviceBehaviors, services und bindings).

Es gab so viele aufrichtige Versuche, Leuten mit diesem Problem zu helfen, die für mich nicht hilfreich waren, dass betont werden sollte, dass diese Beschreibung für eine Silverlight-Lösung gilt und möglicherweise nicht für jemanden gilt, der Silverlight 3 nicht in einer Client / Web-Konfiguration verwendet .

Ich hoffe es hilft.


1

Ich hatte das gleiche Problem, aber keine Ahnung, was es verursacht hat. Ich habe es gelöst, indem ich mit Debug / Start New Instance von Debug zu Release and Run gewechselt habe. Danach lief es sowohl in Release als auch in Debug. Es war Magie ...


Dies ist der Fall, wenn ich eine Web-Benutzeroberfläche und ein Web-Service-Projekt in derselben Lösung habe. Der Webdienst wird nicht kompiliert, wenn er nicht als Abhängigkeit für die Web-Benutzeroberfläche verstanden wird.
StingyJack

1

Ich bin auch auf dieses Problem gestoßen, als ich das WCF-Beispiel Microsoft.ServiceModel.Samples.Calculator ausprobiert habe. Ich verwende IIS 5.1. Ich habe das Problem behoben, indem ich sichergestellt habe, dass die automatisch generierte Website (Servicemodelle) keine Anwendung ist. Klicken Sie mit der rechten Maustaste auf den Ordner, klicken Sie auf "Eigenschaften" und klicken Sie auf die Schaltfläche "Erstellen".


1

Ich hatte meine Service-DLLs im Ordner bin, in dem sich die SVC-Datei befand. Das Verschieben der DLLs in den Ordner "root bin" löste das Problem.


1

In meinem Fall Rechtsklick auf Virtual Directory und wählen Sie "In Anwendung konvertieren" funktioniert!


1
Dank Atul für mich gearbeitet, klingt das so, als wäre das die Lösung für die meisten Anfragenden hier!
Erdinc Ay

1

Ich war heute mit diesem Fehler konfrontiert, Grund war; Der IIS-Benutzer hat keine Berechtigung, auf den Anwendungsordner zuzugreifen. Ich habe die Leseberechtigungen für den App-Stammordner erteilt.


1

Das mag trivial klingen, ist aber erwähnenswert: Sie müssen bauen den Service (in Visual Studio) - dann eine DLL wird in der Bin Unterordner angelegt werden.

Wenn der Dienst auf einem Server "bereitgestellt" wird - dieser bin-Ordner muss diese DLL-Datei enthalten -, wird dieser Fehler andernfalls ausgelöst ...


0

Fügen Sie eine Referenz des Dienstes in Ihren Dienst ein oder kopieren Sie die DLL.


1
Gute Antworten erweitern ihre Punkte in angemessenem Maße - vielleicht könnten Sie zusätzliche Informationen hinzufügen? Wie machen Sie das zum Beispiel ? Warum sollten Sie das tun?
Swadq

@ Swadq Gute Antworten beantworten tatsächlich die Frage, die dies nicht tut; Das Hinzufügen einer Webreferenz unterscheidet sich vom Erstellen eines Dienstes, wie diese Frage lautet. Sie fügen den Verweis auf den Dienst hinzu, nachdem der Dienst erstellt wurde und auf ihn zugegriffen werden kann.
Richard Barker

0

Das Erstellen der Lösung vor dem Hinzufügen der Servicereferenz löste mein Problem.


0

Ich habe diesen Fehler erhalten, als ich versucht habe, die Dienstreferenz für die erste Silverlight-fähige WCF in derselben Lösung hinzuzufügen. Ich habe gerade das .Web-Projekt erstellt und es hat funktioniert.


0

Ich hatte das gleiche Problem, fand diesen Thread, versuchte alle außer Nogo.

Dann verbringe ich weitere 4 Stunden verschwendete Zeit.

Dann stellte ich fest, dass sich die Kompilierungseinstellungen von 64 Bit auf x86 geändert hatten. Als ich es wieder auf 64 Bit änderte, funktionierte es. Ich weiß nicht genau warum, könnte aber sein, dass der IIS-Anwendungspool nicht für 32-Bit-Anwendungen eingestellt wurde.


0
  1. Stellen Sie sicher, dass die Markup-Datei (svc) das Serviceattribut mit dem Namespace.classname und dem Codebehind classname.svc.cs hat

  2. Erstellen Sie die Lösung neu

  3. Starten Sie die App-Pools einmal vom lokalen IIS aus neu.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.