我想设置一个可以由 AJAX 从我们的 Sharepoint Foundation 2010 站点上的自定义 Web 部件加载的 javascript 调用的 WCF。为了简化 Javascript 端的处理,我想提供一个 Restful 服务,将 Json 返回给调用者。
问题是当我使用 AJAX 调用服务器时,SPContext.Current 为空。
我正在使用 svc 文件中的 MultipleBaseAddressWebServiceHostFactory 创建 web 服务
<%@ 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);
}
webservice的实现基本如下。
[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;
}
}
我已经验证,如果我从 webbrowser 调用 web 服务,一切都按预期工作,并且我得到了正确的数据。
我使用以下 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 来提供其上下文,在某种意义上它是匿名的。
起初我认为 Web 服务本身是罪魁祸首,因为从浏览器调用它时它会随机失败,但我认为我通过安装 Sharepoint Foundation 2010 的升级解决了这个问题。
如何从 javascript/web 服务进行 AJAX 调用,该服务接受来自 Javascript 的 AJAX 调用,允许 web 服务访问已登录到 Sharepoint 站点的用户的上下文?