Holen Sie sich SPWeb von SPContext in WCF, das auf SharePoint gehostet wird
-
10-12-2019 - |
Frage
Ich habe einen WCF-Dienst in SharePoint erstellt und bereitgestellt und sende Anfragen mit JQuery.Bis auf die Unterseiten funktioniert alles einwandfrei.
Nehmen wir an, ich habe diese beiden Dienst-URLs:
- http://localhost:1111/_vti_bin...../MethodName
- http://localhost:1111/subsite/_vti_bin...../MethodName
Wenn ich diese beiden URLs verwende, wird die SPContext.Current.Site
ist das Gleiche und richtig.
Aber die SPContext.Current.Web
ist das Gleiche, was falsch ist.Mit der zweiten URL the SPWeb
Das Objekt muss das Unterweb und nicht das Stammweb sein.
Wie kann ich die Unterseite als SPWeb
Objekt?Muss ich die Web-URL immer als Parameter an die WCF-Methode übergeben?
Lösung
Nach der Suche bin ich zu dem Schluss gekommen, dass die SPContext.Current.Web
Werde das immer zurückgeben RootWeb
Daher benötige ich die URL des jeweiligen Sub-Webs.
Um zu vermeiden, dass die SPWeb-URL an jede WCF-Methode übergeben wird, bei der ich ein SPWeb-Objekt benötige, kann ich Folgendes tun:
Ich führe meinen WCF-Dienst im ASP.NET-Kompatibilitätsmodus aus, damit ich den verwenden kann HttpContext
Objekt, und ich kann verwenden HttpContext.Current.Request.RawUrl
.Diese Eigenschaft gibt alles in der URL-Zeichenfolge nach dem Domänennamen zurück.Dann kann ich diese Zeichenfolge abschneiden, um die relative Sub-Web-URL zu erhalten und sie an die zu übergeben OpenWeb()
Methode.
Beispiel:
Auf der Clientseite lautet das URL-Argument des JQuery-AJAX-Aufrufs:
http://localhost:1111/subsite/_vti_bin...../MethodName
Auf der Serverseite, wenn ich es verwende HttpContext.Current.Request.RawUrl
Ich bekomme:
/subsite/_vti_bin...../MethodName
Nachdem ich diese Zeichenfolge abgeschnitten habe, übergebe ich die /subsite
zum OpenWeb()
Methode.
Alle anderen Ideen werden sehr geschätzt.
Andere Tipps
Ich hatte den gleichen Fall.Aber ich habe die URL von hier übernommen:
Uri requestUri = System.ServiceModel.OperationContext.Current.RequestContext.RequestMessage.Headers.To;
So konnte ich ein SPSite-Objekt erstellen:
using (SPSite site = new SPSite(requestUri.Scheme + "://" + requestUri.Host)
{
//your code
}