Obtenez SPWeb à partir de SPContext dans WCF hébergé sur SharePoint
-
10-12-2019 - |
Question
J'ai créé et déployé un service WCF dans SharePoint et j'envoie des requêtes en utilisant JQuery.Tout fonctionne bien, sauf les sous-sites.
Disons que j'ai ces deux URL de service :
- http://localhost:1111/_vti_bin...../MethodName
- http://localhost:1111/subsite/_vti_bin...../MethodName
Lorsque j'utilise ces deux URL, le SPContext.Current.Site
est le même et est correct.
Mais le SPContext.Current.Web
c'est la même chose, ce qui est incorrect.En utilisant la deuxième URL, le SPWeb
L'objet doit être le sous-site Web et non le site Web racine.
Comment puis-je obtenir le sous-site en tant que SPWeb
objet?Dois-je toujours transmettre l’URL Web en tant que paramètre à la méthode WCF ?
La solution
Après recherche, j'ai conclu que le SPContext.Current.Web
retournera toujours le RootWeb
j'ai donc besoin de l'URL du sous-site Web spécifique.
Pour éviter de transmettre l'URL SPWeb à chaque méthode WCF pour laquelle j'ai besoin d'un objet SPWeb, je peux procéder comme suit :
J'exécute mon service WCF en mode de compatibilité ASP.NET afin de pouvoir utiliser le HttpContext
objet, et je peux utiliser HttpContext.Current.Request.RawUrl
.Cette propriété renvoie tout ce qui se trouve dans la chaîne URL après le nom de domaine.Ensuite, je peux tronquer cette chaîne pour obtenir l'URL relative du sous-Web et la transmettre au OpenWeb()
méthode.
Exemple:
Côté client, l'argument URL de l'appel JQuery AJAX est :
http://localhost:1111/subsite/_vti_bin...../MethodName
Côté serveur si j'utilise HttpContext.Current.Request.RawUrl
Je reçois:
/subsite/_vti_bin...../MethodName
Ensuite, après avoir tronqué cette chaîne, je passe le /subsite
au OpenWeb()
méthode.
Toute autre idée est grandement appréciée.
Autres conseils
J'avais le même cas.Mais j'ai pris l'URL d'ici:
Uri requestUri = System.ServiceModel.OperationContext.Current.RequestContext.RequestMessage.Headers.To;
alors j'ai pu créer un objet spsite:
using (SPSite site = new SPSite(requestUri.Scheme + "://" + requestUri.Host)
{
//your code
}