2009-07-26 7 views
0

Description généraleException appelant Silverlight activé le service WCF lors de l'utilisation d'autres assemblées

J'appelle un Silverlight activé le service WCF à partir d'une application Silverlight. Mon service interroge une base de données (SQL Server) et renvoie des valeurs à partir de là. Le problème est que le service utilise d'autres bibliothèques qui font le travail de base de données sale et je reçois cette exception lorsque vous essayez d'utiliser le service:

Exception

System.ServiceModel.CommunicationException was unhandled by user code Message="An error occurred while trying to make a request to URI 'mysite/myservice.svc'. This could be due to attempting to access a service in a cross-domain way without a proper cross-domain policy in place, or a policy that is unsuitable for SOAP services. You may need to contact the owner of the service to publish a cross-domain policy file and to ensure it allows SOAP-related HTTP headers to be sent. This error may also be caused by using internal types in the web service proxy without using the InternalsVisibleToAttribute attribute. Please see the inner exception for more details." StackTrace: 
     at System.ServiceModel.AsyncResult.End[TAsyncResult](IAsyncResult result) 
     at System.ServiceModel.Channels.ServiceChannel.SendAsyncResult.End(SendAsyncResult result) 
     at System.ServiceModel.Channels.ServiceChannel.EndCall(String action, Object[] outs, IAsyncResult result) 
     at System.ServiceModel.ClientBase`1.ChannelBase`1.EndInvoke(String methodName, Object[] args, IAsyncResult result) 
     at ODP_Silverlight.ODP.WCFServices.PropertySetWcfServiceClient.PropertySetWcfServiceClientChannel.EndGetPropertySet(IAsyncResult result) 
     at ODP_Silverlight.ODP.WCFServices.PropertySetWcfServiceClient.ODP_Silverlight.ODP.WCFServices.PropertySetWcfService.EndGetPropertySet(IAsyncResult result) 
     at ODP_Silverlight.ODP.WCFServices.PropertySetWcfServiceClient.OnEndGetPropertySet(IAsyncResult result) 
     at System.ServiceModel.ClientBase`1.OnAsyncCallCompleted(IAsyncResult result) InnerException: System.Security.SecurityException 
     Message="" 
     StackTrace: 
      at System.Net.Browser.AsyncHelper.BeginOnUI(SendOrPostCallback beginMethod, Object state) 
      at System.Net.Browser.BrowserHttpWebRequest.EndGetResponse(IAsyncResult asyncResult) 
      at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelAsyncRequest.CompleteGetResponse(IAsyncResult result) 
     InnerException: System.Security.SecurityException 
      Message="Security error." 
      StackTrace: 
       at System.Net.Browser.BrowserHttpWebRequest.InternalEndGetResponse(IAsyncResult asyncResult) 
       at System.Net.Browser.BrowserHttpWebRequest.<>c__DisplayClass5.<EndGetResponse>b__4(Object sendState) 
       at System.Net.Browser.AsyncHelper.<>c__DisplayClass2.<BeginOnUI>b__0(Object sendState) 
      InnerException: 

Plus d'info

Si Je supprime le "using mylibs" à partir des instructions using et il suffit de retourner la liste simple < int > avec quelques chiffres à la place, le service fonctionne très bien.

Avez-vous des idées?

+0

Que font les mylibs? Où est-il assis? Comment accède-t-il aux données? – serialhobbyist

Répondre

0

L'utilisation de mylibs n'appelle aucun code. Seul le code à l'intérieur de mylibs le fait. Cela semblerait échouer. Vous devriez le tester. Notez que depuis que ce service est exécuté sur le serveur (pas sur le navigateur avec SilverLight), le problème ne peut pas être des autorisations SilverLight.

+0

En fait, mais le problème se produit même si je commente le code en l'utilisant et je garde juste l'instruction using. Ce fut le cas lorsque j'ai reproduit le bug pour copier coller l'exception ici. J'ai trouvé un moyen de contourner ce problème mais ce n'est pas mon premier choix. Si j'ajoute mylib.dll aux assemblys de confiance de la machine, cela fonctionne, mais je voudrais éviter cette solution. Je ne voudrais pas que l'installateur du programme doive faire cela. Vous avez probablement raison, le problème est avec les autorisations de service car il ne peut pas accéder à mylib.dll à moins qu'il ne soit entièrement approuvé. Plus de pensées? – sprite

+0

Non-sens. L'instruction using ne fait rien du tout. Avez-vous également supprimé la référence à la DLL? Avez-vous peut-être une référence à un type dans la DLL, mais ne l'instanciez pas? Cela pourrait éventuellement tirer des constructeurs statiques. Mais toute une déclaration utilisant est fournit une abréviation. "utilisant un;" signifie que vous pouvez vous référer à "A.B" simplement comme "B". –

+0

Eh bien, les références à mylib.dll existaient dans le projet depuis le début. Même si vous mettez de côté les mises à jour (je peux me tromper là-dessus), cela ne fonctionne toujours pas lorsque j'essaie d'invoquer des méthodes et des trucs de la DLL référencée mais fonctionne si je ne le fais pas. Comme je l'ai dit, il fonctionne avec la DLL de référence si j'ajoute la DLL à la liste des "assemblages approuvés" au niveau de la machine avec "caspol -machine -af mylib.dll". – sprite

0

Avez-vous implémenté ClientAccessPolicy.xml et CrossDomain.xml sur le service WCF? Une exception CommunicationException comme celle que vous recevez peut être due à un fichier ClientAccessPolicy.xml manquant ou à un fichier qui n'autorise pas votre client Silverlight à accéder au service.

+0

Bonjour DaveB, J'ai un fichier ClientAccessPolicy.xml en place. Je sais même que cela fonctionne depuis si je l'enlève même en retournant une simple liste < int > ne fonctionne pas parce que le service n'est pas accessible. Mon problème ne commence que si j'utilise d'autres bibliothèques (C# - autres projets dans la même solution dans VS2008). Si je garde toute la logique dans le projet hébergeant le service, alors cela fonctionne, mais je ne voudrais pas faire cela. J'ai déjà un dll qui fait tout le travail DB et j'aimerais le réutiliser. D'autres idées? Merci ... – sprite

+0

Avez-vous testé le service avec WcfTestClient? Existe-t-il également des exceptions? Pouvez-vous voir le fichier .svc dans un navigateur? Pouvez-vous cliquer sur le lien WSDL et confirmer que cela fonctionne? Je travaille actuellement sur un projet qui a la même structure que vous décrivez. Définissez une référence à partir du projet d'implémentation de service dans le projet d'accès aux données et vous ne devriez pas obtenir cette erreur. Est-ce que tous les accès aux données sont locaux? Est-ce que vous pouvez tous les services Web de la couche d'accès aux données? – DaveB

Questions connexes