Я хочу настроить WCF, который может вызываться AJAX из JavaScript, загруженного из пользовательской веб-части на нашем сайте Sharepoint Foundation 2010.Чтобы упростить обработку на стороне Javascript, я хочу представить службу Restful, которая возвращает Json вызывающей стороне.
Проблема заключается в том, что когда я вызываю сервер с вызовом AJAX, SPContext.Current равен null.
Я использую MultipleBaseAddressWebServiceHostFactory в файле svc для создания веб-сервиса
<%@ Assembly Name="$SharePoint.Project.AssemblyFullName$"%>
<%@ServiceHost Language="C#" Debug="true"
Service="Driftportalen.LvService.SuggestService"
Factory="Microsoft.SharePoint.Client.Services.MultipleBaseAddressWebServiceHostFactory, Microsoft.SharePoint.Client.ServerRuntime, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"
%>
Контракт для веб-сервиса:
[ServiceContract(Namespace = "", ProtectionLevel= ProtectionLevel.None)]
public interface ISuggestServiceTest
{
[WebGet(UriTemplate = "/SuggestAddress/{streetprefix}/", ResponseFormat = WebMessageFormat.Json)]
[OperationContract]
Dictionary<string, GenericAddress> SuggestAddress(string streetprefix);
}
Реализация веб-сервиса в основном следующая.
[Guid("BA6733B3-F98D-4AD8-837D-7673F8BC527F")]
[BasicHttpBindingServiceMetadataExchangeEndpoint]
[ServiceBehavior(IncludeExceptionDetailInFaults = true, AddressFilterMode = AddressFilterMode.Any)]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
public class SuggestService : ISuggestServiceTest
{
private SPWeb currentWeb;
public SPWeb CurrentWeb
{
get
{
if (currentWeb == null)
{
var siteUrl = SPContext.Current.Web.Url;
SPSecurity.RunWithElevatedPrivileges(delegate
{
using (var site = new SPSite(siteUrl))
using (var web = site.OpenWeb())
{
currentWeb = web;
}
});
}
return currentWeb;
}
}
public Dictionary<string, GenericAddress> SuggestAddress(string streetprefix)
{
LvService lvService = new LvService(CurrentWeb);
Dictionary<string, GenericAddress> suggestions = new Dictionary<string, GenericAddress>();
//SNIP
//Code that uses lvService to populate suggestions
return suggestions;
}
}
Я подтвердил, что если я вызываю веб-сервис из веб-браузера, все работает, как ожидалось, и что я получаю правильные данные.
Я использую следующий вызов Ajax
$.ajax({
url: addressUrl + "/"+request.term,
dataType: 'json',
success: function (data) {
responseCallback(data);
$(this).removeClass("fetching");
}
});
Использование Firebug Я проверил, что из javascript вызывается правильный URL, и на стороне сервера я убедился, что правильный код действительно достигнут, но SPContext.Current равен нулю.
SharepointСервер использует Windows и претензии для входа в систему.Это означает, что фактический WCF будет выполняться с использованием другой учетной записи, отличной от решения Sharepoint, но поскольку я развертываю в папке ниже vti_bin, Sharepoint должен предоставить его контекст для WCF.Мне кажется, что вызов AJAX не будет запускать Sharepoint для предоставления своего контекста, в некотором смысле он анонимный.
Сначала я предположил, что виноват сам веб-сервис, так как он случайно произойдет сбой при вызове изБраузер, но я думаю, что я решил эту проблему, установив обновление до Sharepoint Foundation 2010.
Как я могу сделать AJAX-вызов из javascript / веб-службы, которая принимает AJAX-вызовы из Javascript, которые позволяют веб-сервисуполучить доступ к контексту пользователя, который выполнил вход на сайт Sharepoint?