HTTP error 500: System.ServiceModel.ServiceActivationException

Quand vous essayez d'accéder à une application WCF, via une application Silverlight, en utilisant l'authentification intégrée, l'accès échoue en vous indiquant qu'un accès anonyme est requis.
Si vous prenez une trace réseau lors de cet accès, vous pouvez voir le message d'erreur suivant : "500 : System.ServiceModel.ServiceActivationException".

En complément, vous pouvez voir le message d'erreur suivant dans le journal d'évènement applicatif :

 Nom du journal :Application
Source : System.ServiceModel 4.0.0.0 
Date : 10/05/2011 08:13:29 
ID de l'événement :3 
Catégorie de la tâche :WebHost 
Niveau : Erreur 
Mots clés : Classique 
Utilisateur : S-1-5-21-… 
Ordinateur : MachineDeTest 
Description : 
 WebHost failed to process a request. 
Sender Information: System.ServiceModel.ServiceHostingEnvironment+HostingManager/47005364 
Exception: System.ServiceModel.ServiceActivationException: The service 'MyService.svc' cannot be activated due to an exception during compilation. The exception message is: Security settings for this service require 'Anonymous' Authentication but it is not enabled for the IIS application that hosts this service.. ---> System.NotSupportedException: Security settings for this service require 'Anonymous' Authentication but it is not enabled for the IIS application that hosts this service. 
  at System.ServiceModel.Activation.HostedAspNetEnvironment.ValidateHttpSettings(String virtualPath, Boolean isMetadataListener, Boolean usingDefaultSpnList, AuthenticationSchemes& supportedSchemes, ExtendedProtectionPolicy& extendedProtectionPolicy, String& realm) 
  at System.ServiceModel.Channels.HttpChannelListener.ApplyHostedContext(String virtualPath, Boolean isMetadataListener) 
  at System.ServiceModel.Channels.HttpTransportBindingElement.BuildChannelListener[TChannel](BindingContext context) 
  at System.ServiceModel.Channels.Binding.BuildChannelListener[TChannel](Uri listenUriBaseAddress, String listenUriRelativeAddress, ListenUriMode listenUriMode, BindingParameterCollection parameters) 
  at System.ServiceModel.Description.DispatcherBuilder.MaybeCreateListener(Boolean actuallyCreate, Type[] supportedChannels, Binding binding, BindingParameterCollection parameters, Uri listenUriBaseAddress, String listenUriRelativeAddress, ListenUriMode listenUriMode, ServiceThrottle throttle, IChannelListener& result, Boolean supportContextSession) 
  at System.ServiceModel.Description.DispatcherBuilder.BuildChannelListener(StuffPerListenUriInfo stuff, ServiceHostBase serviceHost, Uri listenUri, ListenUriMode listenUriMode, Boolean supportContextSession, IChannelListener& result) 
  at System.ServiceModel.Description.DispatcherBuilder.InitializeServiceHost(ServiceDescription description, ServiceHostBase serviceHost) 
  at System.ServiceModel.ServiceHostBase.InitializeRuntime() 
  at System.ServiceModel.ServiceHostBase.OnOpen(TimeSpan timeout) 
  at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) 
  at System.ServiceModel.ServiceHostingEnvironment.HostingManager.ActivateService(String normalizedVirtualPath) 
  at System.ServiceModel.ServiceHostingEnvironment.HostingManager.EnsureServiceAvailable(String normalizedVirtualPath) 
  --- End of inner exception stack trace --- 
  at System.ServiceModel.ServiceHostingEnvironment.HostingManager.EnsureServiceAvailable(String normalizedVirtualPath) 
  at System.ServiceModel.ServiceHostingEnvironment.EnsureServiceAvailableFast(String relativeVirtualPath) 
 Process Name: w3wp 
Process ID: 5660 

La cause de ce problème est la non présence du namespace pour le service & le contrat au sein du Web.Config dans la section system.serviceModel.
Le namespace permet d'identifier l'emplacement d'un objet. Par exemple, si je prends deux personnes (Alfred & Bob) qui possèdent chacune une voiture.
Lorsque j'invoque l'objet voiture, je ne suis pas capable de savoir quelle voiture j'invoque, celle d'Alfred ou celle de Bob ?
Il est indispensable de spécifier le namespace afin d'éclaircir ce point. Cela nous donnera : Alfred.voiture ou Bob.voiture.
Il s'agit donc de faire la même chose avec le service et le contrat.

Ci-dessous un extrait de la section system.serviceModel qui est incorrecte :

<system.serviceModel>
     <services>
          <service name="Service1" behaviorConfiguration="MyServiceBehavior">
               <endpoint address="" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_Service_conf" contract="IService1" name="BasicHttpBinding_Service"/>
          </service>
     </services>
</system.serviceModel>

 

Ci-dessous un extrait de la section system.serviceModel qui est correcte :
Le mot "NameSpace" est à remplacer par le NameSpace de votre service.

<system.serviceModel>
     <services>
          <service name="NameSpace. Service1" behaviorConfiguration="MyServiceBehavior">
               <endpoint address="" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_Service_conf" contract="NameSpace. IService1" name="BasicHttpBinding_Service"/>
          </service>
     </services>
</system.serviceModel>

Si l'authentification ne fonctionne toujours pas, vérifiez bien que le EndPoint configuré dans le fichier ServiceConfiguration.Config est correct.

En espérant que cet article vous sera utile.
@ Bientôt
Sylvain Lecerf et L'équipe de support IIS Microsoft France