Получить SPWeb из SPContext в WCF, размещенном в SharePoint
-
10-12-2019 - |
Вопрос
Я создал и развернул службу WCF в SharePoint и отправляю запросы с помощью jQuery.Все работает нормально, за исключением вспомогательных сайтов.
Допустим, у меня есть эти два URL-адреса сервиса:
- http://localhost:1111/_vti_bin...../MethodName
- http://localhost:1111/subsite/_vti_bin...../MethodName
Когда я использую эти два URL-адреса, SPContext.Current.Site
это то же самое и является правильным.
Но тот SPContext.Current.Web
это то же самое, что неверно.Используя второй URL-адрес, SPWeb
объект должен быть вспомогательным веб-сайтом, а не корневым веб-сайтом.
Как я могу получить вспомогательный сайт в качестве SPWeb
возражать?Нужно ли мне всегда передавать веб-URL в качестве параметра методу WCF?
Решение
После поиска я пришел к выводу, что SPContext.Current.Web
всегда будет возвращать RootWeb
итак, мне нужен URL-адрес конкретного подсети.
Чтобы избежать передачи URL-адреса SPWeb каждому методу WCF, где мне нужен объект SPWeb, я могу сделать следующее:
Я запускаю свою службу WCF в ASP.NET режиме совместимости, чтобы я мог использовать HttpContext
возражайте, и я могу использовать HttpContext.Current.Request.RawUrl
.Это свойство возвращает все, что находится в строке URL после имени домена.Затем я могу усечь эту строку, чтобы получить относительный URL-адрес вложенного веб-сайта, и передать его в OpenWeb()
способ.
Пример:
На стороне клиента аргументом URL вызова jQuery AJAX является:
http://localhost:1111/subsite/_vti_bin...../MethodName
На стороне сервера, если я использую HttpContext.Current.Request.RawUrl
Я получаю:
/subsite/_vti_bin...../MethodName
Затем, после того как я усекаю эту строку, я передаю /subsite
к тому OpenWeb()
способ.
Любые другие идеи будут высоко оценены.
Другие советы
У меня был тот же случай.Но я взял URL отсюда:
Uri requestUri = System.ServiceModel.OperationContext.Current.RequestContext.RequestMessage.Headers.To;
.
Так что я смог создать объект SPSite:
using (SPSite site = new SPSite(requestUri.Scheme + "://" + requestUri.Host)
{
//your code
}
.