37 votes

Problème avec le type de service dans la directive ServiceHost dans le service wcf

Je développe un service wcf simple pour le test. Lorsque je teste ce service avec mon IIS 7.5 local, il fonctionne correctement. Mais quand je l'héberge dans le web IIS, je reçois cette erreur :

Le type 'WcfServiceLibrary1.Service1', fourni comme valeur de l'attribut Service dans la directive ServiceHost, ou fourni dans l'élément de configuration system.serviceModel/serviceHostingEnvironment/serviceActivations n'a pas pu être trouvé.

Et mon ServiceHost est :

<%@ ServiceHost Language="C#" Debug="true" Service="WcfServiceLibrary1.Service1" %>

Veuillez m'aider à résoudre ce problème

0 votes

Je pense que j'ai un problème avec l'assemblage

6 votes

Quels fichiers avez-vous déployé sur votre serveur web IIS ? Vous avez besoin : d'un répertoire virtuel avec le fichier *.svc à l'intérieur, et un bin le répertoire au-dessous avec ceci avec DLL contenant votre service de WCF

0 votes

Oui, j'ai créé un répertoire dans mon espace hôte et j'ai copié tout mon projet (WcfServiceLibrary1) dans mon répertoire (pour le test). mais mon problème n'est pas résolu !!! dans mon projet existe un fichier .svc et le service a fonctionné correctement avec l'iis local.

41voto

Jac Points 680

Parce que je n'ai pas trouvé cette suggestion dans aucune des questions que j'ai parcourues pour cela, j'ajoute mon cas ici :

J'ai rencontré ce problème lorsque j'ai modifié manuellement l'espace de noms dans le fichier MyService.svc.cs, sans modifier le nom du service dans le fichier correspondant MyService.svc - il s'est avéré qu'il devait être Service="namespace.classname".

4 votes

Cela m'a aussi frappé, alors que je mettais en place mon premier service WCF "Hello World". Si vous changez l'espace de nom dans le code, n'oubliez pas de faire un clic droit sur le .svc, choisissez "show markup" et, comme le dit Jac, modifiez l'espace de nom là aussi.

3 votes

Cette correction d'espace de noms s'applique également si vous injectez une application de service WCF externe dans une application Web ASP.NET comme ci-dessous. Assurez-vous que l'espace de nom est spécifié dans le serviceActivations : <system.serviceModel> <serviceHostingEnvironment aspNetCompatibilityEnabled="true"> <serviceActivations> <add service="MyServicesNamespace.MyService" relativeAddress="~/PathTo/MyService.svc"/> </serviceActivations> </serviceHostingEnvironment> </system.serviceModel>

0 votes

Et si vous procédez de cette façon, vous devrez probablement aussi autoriser AspNetCompatibilityRequirementsMode

21voto

Andras Zoltan Points 24996

Essayez d'utiliser le nom de type qualifié de l'assemblage.

Esto es [Fully Qualified Type Name], [Assembly]

Donde [Fully Qualified Type Name] est, dans les cas les plus courants YourNamespace.YourType

Y [Assembly] est, dans les cas les plus courants YourAssemblyName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null

Cela peut être plus compliqué que cela (types génériques, types imbriqués, etc.), mais il est peu probable que ce soit le cas pour vous.

Si votre application utilise les options de construction par défaut, je suppose que la directive devrait être quelque chose comme ceci :

<%@ ServiceHost Language="C#" Debug="true" 
   Service="WcfServiceLibrary1.Service1, 
            WcfServiceLibrary1, 
            Version=1.0.0.0, 
            Culture=neutral, 
            PublicKeyToken=null" %>

Bien que vous voudrez probablement vous débarrasser des sauts de ligne à cet endroit.

Vérifiez également que votre dll a bien été déployée.

2 votes

Le fichier *.dll (incluant mon service) a été déployé dans le dossier Bin.

0 votes

Veuillez me donner un exemple de ServiceHost avec un nom de type entièrement qualifié.

0 votes

Merci pour votre réponse. J'utilise un nom de type qualifié pour l'assemblage, mais mon problème n'est pas résolu avec cette approche.

8voto

mike kozelsky Points 111

J'ai eu le même problème uniquement lors de la publication de mon service mais cela a fonctionné localement.

Il s'est avéré que le service faisait référence à une DLL qui n'était pas déployée. C'est un cas très particulier car il s'agissait d'une DLL système (System.Web.Helpers) et donc le projet n'avait même pas de référence à cette DLL et donc l'option "Copy Local" n'était pas activée.

1 votes

Ça semble ridicule de vérifier ça, mais ma DLL manquait aussi.

0 votes

J'avais un assemblage Microsoft.Identity qui n'était pas configuré pour copier localement, et il produisait cette erreur lorsqu'il était déployé en production, mais pas lorsqu'il était exécuté localement. Incroyablement ennuyeux, mais vrai.

0 votes

Une dll référencée par mon service de données était absente du dossier bin\ et cela a généré l'erreur. J'ai ajouté la dll manquante, le service a fonctionné.

8voto

Nij Points 669

Par défaut, IIS s'attend à voir le fichier svc dans le répertoire virtuel, et les binaires dans un dossier bin (comme l'a commenté marc_s).

Cependant, la configuration de construction par défaut pour des projets de bibliothèque de WCF est de construire dans un dossier de bin/Debug (ou bin/Release). Vous pouvez changer le chemin de sortie à 'bin/' sur les propriétés du projet, onglet Build.

Ce changement a résolu cette erreur pour moi aujourd'hui.

0 votes

Dans mon cas, le chemin de sortie par défaut pour un projet WCF était bin. J'ai rencontré le problème lorsque j'ai changé le chemin de sortie en bin. \Debug. Ça a bien marché quand je l'ai remis à bin\.

4voto

hamed aj Points 790

Enfin, mon problème est résolu.

J'ai supprimé le répertoire de service dans mon hôte et créé un nouveau répertoire virtuel dans l'espace hôte. Puis j'ai copié mon service dans le nouveau répertoire où je l'ai créé.

Maintenant je peux parcourir le fichier .svc pour le service et mon client consommera le service.

Je ne comprends pas pourquoi ce problème s'est produit ! Je suis un peu perdue !

1 votes

J'avais ajouté le mien comme un simple répertoire et j'avais besoin de le convertir en application.

0 votes

Le commentaire ci-dessus est ce que j'ai dû faire pour : dans mon localhost, le dir était une application ou un répertoire virtuel, et quand j'ai déployé vers le www, j'avais juste ftp'd stuff up there.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X