web-dev-qa-db-fra.com

Service WCF, le type fourni en tant que valeurs d'attribut de service… est introuvable.

Lorsque je clique avec le bouton droit de la souris sur Eval.svc dans Visual Studio 2012 et l’affiche dans le navigateur, j’obtiens ce qui suit - 

Le type 'EvalServiceLibary.Eval', fourni comme valeur d'attribut Service dans la directive ServiceHost, ou fourni dans l'élément de configuration system.serviceModel/serviceHostingEnvironment/serviceActivations est introuvable.

Lorsque j'exécute le service WCF à partir du client de test, tout fonctionne correctement.

Service d'évaluation:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class EvalService : IEvalService
{
    Dictionary<string, JobPhaseTimer> jobTimers = new Dictionary<string, JobPhaseTimer>();

    public void SubmitEntry(ENBO.Jobs.Job job, ENBO.Jobs.JobDetail jobDetail, ENBO.TimeLogs.TimeLog timeLog, ENBO.Users.User user, ENBO.Utilities.EntryType entryType, JobPhase jobPhase)
    {
        if (entryType == EntryType.Active)
        {
            JobPhaseTimer timer = new JobPhaseTimer();
            timer.UID = job.ID + "_" + jobPhase.ID;
            timer.JobID = job.ID;
            timer.JobDetailID = jobDetail.ID;
            timer.PhaseID = jobPhase.ID;
            timer.StartTime = DateTime.Now;
            timer.Stopwatch.Start();
            jobTimers.Add(timer.UID, timer);

            TimeLog log = new TimeLog();
            log.JobID = job.ID;
            log.PhaseID = jobPhase.ID;
            log.UserID = user.ID;
            log.DateEntry = DateTime.Now;
            log.EntryType = EntryType.Active;

            if (log.AddNewTimeLog())
            {
                //Do something
            }
        }
        else if (entryType == EntryType.Paused)
        {
            JobPhaseTimer timer = jobTimers[job.ID + "_" + jobPhase.ID];
            timer.Stopwatch.Stop();

            TimeLog log = new TimeLog();
            log.JobID = job.ID;
            log.PhaseID = jobPhase.ID;
            log.UserID = user.ID;
            log.DateEntry = DateTime.Now;
            log.EntryType = EntryType.Paused;

            if (log.AddNewTimeLog())
            {
                //Do something
            }
        }
    }
}

IEvalService.cs (contrat de service)

[ServiceContract]
public interface IEvalService
{
    [OperationContract]
    void SubmitEntry(Job job, JobDetail jobDetail, TimeLog timeLog, User user, EntryType entryType, JobPhase jobPhase);
}

Eval.svc balisage:

<%@ ServiceHost Language="C#" Debug="true" Service="EvalServiceLibary.Eval" %>

Web.config:

<?xml version="1.0"?>
<configuration>

  <appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
  </appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5"/>
  </system.web>
  <system.serviceModel>
    <services>
      <service name="EvalServiceLibary.EvalService">
        <endpoint address="" behaviorConfiguration="" binding="webHttpBinding"
      contract="EvalServiceLibary.IEvalService" />
        <endpoint address="" binding="basicHttpBinding" bindingConfiguration=""
      contract="EvalServiceLibary.IEvalService" />
      </service>
    </services>
    <behaviors>
      <endpointBehaviors>
        <behavior name="EvalServiceSite.EvalAspNetAjaxBehavior">
          <enableWebScript />
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior name="">
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <protocolMapping>
        <add binding="basicHttpsBinding" scheme="https" />
    </protocolMapping>    
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"
      multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
    <directoryBrowse enabled="true"/>
  </system.webServer>
</configuration>

Des idées pourquoi je reçois cette erreur? J'ai cherché sur Google et trouvé quelques pages, mais rien ne semble fonctionner.

Merci!

25
dynamicuser

Il s'avère que le fichier Eval.svc.cs avait besoin que son espace de noms soit changé en EvalServiceLibary, plutôt qu'en EvalServiceSite.

9
dynamicuser

Modifiez la ligne suivante dans votre fichier Eval.svc à partir de: 

<%@ ServiceHost Language="C#" Debug="true" Service="EvalServiceLibary.Eval" %> 

à: 

<%@ ServiceHost Language="C#" Debug="true" Service="EvalServiceLibary.EvalService" %>
64
user3578181

Assurez-vous que les fichiers binaires sont dans le sous-répertoire "bin" de votre fichier ".svc".

31
vasek

Face à ce problème précis. Le problème a été résolu lorsque j'ai modifié la balise Service = "Namespace.ServiceName" dans le balisage (cliquez avec le bouton droit de la souris sur xxxx.svc et sélectionnez Afficher le balisage dans visual studio) pour correspondre à l'espace de noms que j'ai utilisé pour mon fichier xxxx.svc.cs

16
TheCopyPaster

Je viens juste de frapper ce problème moi-même, et ni ceci ni aucune des autres réponses sur le net n'ont résolu mon problème. Pour moi, c’était un cas étrange: le répertoire virtuel avait été créé sur une autre branche d’un autre serveur de contrôle de code source (nous avions en fait mis à niveau de TFS 2010 à 2013) et la solution s’était souvenue de sa correspondance.

Quoi qu'il en soit, j'ai cliqué à nouveau sur le bouton "Créer un répertoire virtuel" dans les propriétés du projet de service. Il m'a donné un message sur le mappage vers un dossier différent et j'aimerais le mettre à jour. J'ai cliqué sur oui, et cela a résolu le problème.

4
Detail
  1. Lorsque vous créez une application IIS, seul le dossier /bin ou /App_Code se trouve dans le répertoire racine de l'application IIS. Souvenez-vous donc de mettre tout le code dans le répertoire racine /bin ou /App_code (voir http://blogs.msdn.com/b/chrsmith/archive/2006/08/10/wcf-service-nesting-in-iis. aspx ).

  2. Assurez-vous que le nom du service et le contrat contiennent le nom complet (par exemple, namespace.ClassName), et que le nom du service et l'interface sont identiques à l'attribut name du tag de service et au contrat du noeud final dans web.config.

3

J'ai changé le chemin de sortie du service. il devrait se trouver dans le dossier bin du projet de service. Une fois que j'ai remis le chemin de sortie à bin, cela a fonctionné.

2
Gokul

Cliquez avec le bouton droit sur le fichier .svc dans l'Explorateur de solutions, puis cliquez sur View Markup.

 <%@ ServiceHost Language="C#" Debug="true" 
     Service="MyService.**GetHistoryInfo**" 
     CodeBehind="GetHistoryInfo.svc.cs" %>

Mettez à jour la référence de service à laquelle vous faites référence.

1
Joe

J'ai eu le même problème. Assurez-vous d'inclure le nom de l'assembly dans la propriété Factory dans votre fichier .svc. Peut-être devrez-vous nettoyer le cache IIS si vous aviez renommé le nom de l’assemblée du projet.

1
Jalal

J'ai aussi eu le même problème. À dessein, mon chemin de sortie de construction était "..\bin" et cela fonctionne pour moi lorsque je le configure comme "\ bin".

0
K.Kirivarnan

Vérifiez les versions des projets .net. Les projets qui se sont référencés avec des versions différentes .net posent des problèmes.

0
Mehmet

Dans mon cas, j’ai fait un "Convertir en application" dans le mauvais dossier sur iis . Mon application a été placée dans un sous-dossier où elle aurait dû se trouver.

0
Navy Seal

J'ai eu cette erreur lorsque la configuration de génération actuelle dans Visual Studio était définie sur autre chose que Debug.

0
BineG