none
Appel WS depuis une webpart, OK sur un site, KO sur l'autre... RRS feed

  • Question

  • Bonjour,

    J'ai un problème pour appeler un lists.asmx depuis une webpart.

    Le problème est le suivant:
    Phase A
    1. Développement d'une webpart avec appel de GetListItems (référencement via WebReference et non ServiceReference du WS --> http://localhost/_vti_bin/Lists.asmx)
    2. Packaging avec WSPBuilder
    3. Déploiement sur le site localhost
    4. Test --> OK

    Phase B
    1. Même ferme, autre collection de site sur un autre port
    2. Déploiement ok
    3. Au moment de l'appel au WS : "Exception of type 'Microsoft.SharePoint.SoapServer.SoapServerException' was thrown. "

    Comme c'est toujours la machine de dev, je passe en mode débug, vérifie l'url du WS, c'est bien sur la bonne collection, bon site, mais l'appel échoue...


    Tout le code principal est là :
    ListsWS.Lists ws = new ListsWS.Lists(); 
    ws.Url = SPContext.GetContext(Context).Web.Url + "/_vti_bin/Lists.asmx"; 
    ws.Credentials = CredentialCache.DefaultNetworkCredentials; 
     
    XmlNode resNode = ws.GetListItems(ListLimitedTo, null, queryNode, viewFieldsNode, "1000", queryOptionsNode, null); 
     

    PS: Le déploiement de la DLL se fait dans le bin, et non le GAC.

    La dernière ligne provoque l'exception...
    Je n'arrive pas à déterminer la source du problème...

    J'ai tester les cas de figure suivant :
    1. Full Trust dans web.config
    2. DLL dans le GAC
    3. Copie du web.config du premier site à la place du deuxième (pour vérifier qu'aucune déclaration ne manquait...)

    Aucun n'a résolu le pb.
    Merci pour votre aide.

    Charles
    vendredi 6 février 2009 13:22

Toutes les réponses

  • Bonjour,
     Vous avez à priori essayé toutes les solutions que je vous aurai proposé.
    Je ne vois donc pas plus ou est votre problème.
    cependant, pourquoi passer par un web service si c'est pour afficher les données dans une webpart ? il serait plus simple (et plus performant) d'utiliser directement le modèle objet de SharePoint.

    Cdt,
    MCT, MCSD, MCSA, MCDBA & SharePoint Developer - http://blogs.coforcert.com/dntamack
    vendredi 6 février 2009 22:43
  • Bonjour,

    L'appel à un WebService via SharePoint colle aux problématiques de double saut. Celà signifie que vous pouvez obtenir des réponses Http 401 (non autorisé) lorsque SharePoint effectue des requêtes en tentant d'utiliser les credentials de l'utilisateur (DefautCredentials ou NetworkCredentials comme c'est le cas pour vous).

    Si c'est bien ce cas de figure, Kerberos permet de régler ce problème :

    • Si Kerberos n'est pas activé pour vous, celà peut quand même fonctionner dans le premier cas si le site intérrogé est accessible de manière anonyme (quelles sont les propriétés de votre collection de site et de votre Web Application en matière de connexion anonyme ?).

     

    • Si toutefois Kerberos est déjà activé, est-il bien configuré ? L'URL du WebService appelé est-elle prise en compte dans les setspn Kerberos  ?


    http://blogs.developpeur.org/gribouillon/

    dimanche 8 février 2009 13:26
    Modérateur
  • Bonjour,

    Merci pour votre proposition.
    Nous n'utilisons pas Kerberos, et je n'envisage pas de l'activer pour le moment...

    Par ailleurs, différents éléments m'avaient fait prendre le choix de WS au lieu de l'API... mais je crois que je vais revenir en arrière.

    J'ai eu en effet quelques soucis de choix entre SPQuery, SPSiteDataQuery, et GetListItems  qui retournaient plus ou moins les données comme souhaitées.
    Le plus satisfaisant était GetListItems, mais bon. (meilleur compromis entre paramétrage, options disponibles et format des données...)

    N'ayant pas non plus eu de problème au moment d'intégrer le WS dans le projet, j'ai continué. Ce n'est qu'au moment de tester un déploiement sur un autre site que j'ai rencontré le problème mentionné.

    Pour faire bref, je vais faire la chose suivante :
    1. Revenir vers SPSiteDataQuery pour mes besoins
    2. Me poser beaucoup de question quant à l'utilisation des WS dans les projets futurs

    Mais juste pour info, comment pourrais-je avoir plus d'infos sur l'Exception Soap ? (PS : En mode débug, je n'ai rien dans le InnerException... genre AccessDenied ou autre)
    Est-ce que l'utilisation de "Service Reference" au lieu de "Web Reference" change beaucoup de chose ?
    Est-ce judicieux de référencer un WS Sharepoint en utilisant les références standard de Visual Studio, ou est-ce plus intelligent de créer le message Soap via code pour plus de souplesse ?

    Merci encore pour vos contributions.


    lundi 9 février 2009 11:25
  • Effectivement, votre besoin colle avec une utilisation de l'API plutôt que les WebServices. L'avantage des WebServices est de vous permettre une intégration avec des applications distantes ou des services windows (utilisation de tous les serveurs au lieu du serveur sur lequel est installé le service).

    En ce qui concerne votre Exception, il s'agit certainement d'une erreur Interne, et je penche vraiment pour la problématique de double saut (surtout sans Kerberos).

    Pour référencer votre WebService, pas de pb à le faire directement via VS. Pensez juste à modifier l'URL dynamiquement. Si vous jetez un coup d'oeil aux WebServices SharePoint, vous verrez qu'ils prennent en compte le contexte (URL du site sur lequel le webservice est appelé... mais un fichier List.asmx sera le même que le service soit appelé sur un site ou sur un autre).
    http://blogs.developpeur.org/gribouillon/
    lundi 9 février 2009 11:50
    Modérateur