2009-08-07 8 views
3

Je reçois cette erreur lors d'un appel à un service WCF d'une application ASP.Net:exception aléatoire AuthenticationManager CustomTargetNameDictionary lorsque vous appelez un service WCF

Unhandled Exception: System.InvalidOperationException 

System.InvalidOperationException: The entry found in AuthenticationManager's CustomTargetNameDictionary for {URL} does not match the requested identity of host/{Hostname}. 

Server stack trace: 
    at System.ServiceModel.Channels.HttpTransportSecurityHelpers.AddIdentityMapping(Uri via, EndpointAddress target) 
    at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.PrepareOpen() 
    at System.ServiceModel.Channels.HttpsChannelFactory.HttpsRequestChannel.OnOpen(TimeSpan timeout) 
    at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) 
    at System.ServiceModel.Channels.ServiceChannel.OnOpen(TimeSpan timeout) 
    at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) 
    at System.ServiceModel.Channels.ServiceChannel.CallOpenOnce.System.ServiceModel.Channels.ServiceChannel.ICallOnce.Call(ServiceChannel channel, TimeSpan timeout) 
    at System.ServiceModel.Channels.ServiceChannel.CallOnceManager.CallOnce(TimeSpan timeout, CallOnceManager cascade) 
    at System.ServiceModel.Channels.ServiceChannel.EnsureOpened(TimeSpan timeout) 
    at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout) 
    at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs) 
    at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation) 
    at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message) 

La partie étrange à ce sujet est que je ne peux pas le reproduire sur n'importe quelle machine autre que nos serveurs web de production, et cela n'arrive que sporadiquement. Le service nécessite l'authentification Active Directory, mais je suis sûr que l'utilisateur possède le bon ensemble d'autorisations.

Cela ne semble pas être un problème avec la configuration WCF car cela fonctionne parfois, et d'autres applications font des appels au même service sans erreur.

J'ai déjà essayé de recréer complètement l'utilisateur, en recréant le pool d'applications dans lequel il s'exécute et en réinstallant l'application. Merci pour l'aide!

Répondre

0

Cela semble correspondre au "vieux" problème avec "usurpation d'identité". Avec quels éléments ou quelles solutions utilisez-vous des informations d'identification? Si votre utilisateur Web (même s'il est connecté à votre domaine) est emprunté correctement dans l'application ASP.net, votre chaîne peut se rompre lors de l'appel du WS (et de l'AD à partir de là). Assurez-vous donc que votre WS s'exécute avec un contexte utilisateur, et qu'il est autorisé à accéder aux parties AuthManager. Si vous en avez besoin, assurez-vous que la délégation Kerberos est activée sur le compte utilisateur ou sur les comptes machine.

(Vous pourriez ne pas voir ce problème lors de l'élaboration de votre PC parce que vous exécutez probablement en tant qu'administrateur et avoir « debug » permissions.)

HTH, Thomas

0

je suis tombé sur le même problème avec la même erreur. Il faisait ma tête, mais j'ai trouvé la solution.

Il semble s'agir d'un problème de mise en cache dans les bibliothèques client WCF. Il ressemble à cela pour chaque URL de service Web, il se souvient de l'identité du point de terminaison. Si deux demandes sont faites pour un service Web unique à partir du code dans le même pool d'applications, vous obtiendrez l'erreur que vous avez signalée si elles n'utilisent pas exactement la même identité. Dans ma situation, une identité utilisait une majuscule et l'autre une minuscule. Par conséquent, tout code appelé en premier continuerait à fonctionner correctement, mais tout code utilisant la seconde identité échouerait systématiquement jusqu'à ce que le pool d'applications soit redémarré.

Mon code est le suivant

// ** Specify an identity (any identity) in order to get it past .net3.5 sp1 
EndpointIdentity epi = EndpointIdentity.CreateUpnIdentity("unknown"); 
EndpointAddress epa = new EndpointAddress(new Uri(address), epi); 

Un autre morceau de code "inconnu" plutôt que "inconnu"

Questions connexes