我想在一个偏僻的SharePoint站点(不同SP Web应用程序)来读取从列表中值。 Web应用程序使用声明身份验证进行设置,客户端Web应用程序SP托管帐户使用SPN进行配置。我相信Kerberos和声明是正确设置的,但我无法访问远程服务器,并且请求导致一个异常:“远程服务器返回错误:(401)未经授权。”的SharePoint 2010客户端对象模型 - 的Kerberos /宣称验证
行ctx.ExecuteQuery();
发生异常,但它不捕获if (scope.HasException)
中的异常,而是调用代码捕获异常(使用{}块之外)。
当我看在交通使用Wireshark的远程服务器上,它看起来并不像请求甚至让服务器;这几乎就像在Kerberos票据交换索赔之前发生了401一样。
这里是我的代码:
using (ClientContext ctx = new ClientContext(contextUrl))
{
CredentialCache cc = new CredentialCache();
cc.Add(new Uri(contextUrl), "Kerberos", CredentialCache.DefaultNetworkCredentials);
ctx.Credentials = cc;
ctx.AuthenticationMode = ClientAuthenticationMode.Default;
ExceptionHandlingScope scope = new ExceptionHandlingScope(ctx);
Web ctxWeb = ctx.Web;
List ctxList;
Microsoft.SharePoint.Client.ListItemCollection listItems;
using (scope.StartScope())
{
using (scope.StartTry())
{
ctxList = ctxWeb.Lists.GetByTitle("Reusable Content");
CamlQuery qry = new CamlQuery();
qry.ViewXml = string.Format(ViewQueryByField, "Title", "Text", SharedContentTitle);
listItems = ctxList.GetItems(qry);
ctx.Load(listItems, items => items.Include(
item => item["Title"],
item => item["ReusableHtml"],
item => item["ReusableText"]));
}
using (scope.StartCatch()) { }
using (scope.StartFinally()) { }
}
ctx.ExecuteQuery();
if (scope.HasException)
{
result = string.Format("Error retrieving content<!-- Error Message: {0} | {1} -->", scope.ErrorMessage, contextUrl);
}
if (listItems.Count == 1)
{
Microsoft.SharePoint.Client.ListItem contentItem = listItems[0];
if (SelectedType == SharedContentType.Html)
{
result = contentItem["ReusableHtml"].ToString();
}
else if (SelectedType == SharedContentType.Text)
{
result = contentItem["ReusableText"].ToString();
}
}
}
我实现与CredentialCache部分不应该要求必要的,但每一个例子,我能找到的是无论是在一个控制台应用程序运行,或在客户端某种应用;此代码在常规ASP.NET UserControl的代码隐藏中运行。
编辑:我应该提到,当远程URL是与调用代码相同的Web应用程序的根网站集时,上述代码甚至不起作用(它位于/ sites/) - 换句话说,即使主机名与调用代码相同。
什么就尝试下任何建议都非常感谢!
Mike
我需要能够进行跨Web应用程序的调用,并在服务器场......我想我可以放弃交叉农场功能,但我更愿意把它。它实际上是在用户控件运行,不是一个Web部件,但我想就它而言,这里几乎没什么不同 - 它们都运行在SPContext中。我想这是值得尝试服务器端API的跨Web应用程序调用,因为我使用Kerberos。今天早上我会试一试。 – 2012-03-16 14:48:08
那么,为了跟进,我无法在该环境中使用客户端OM进行跨农场调用。我仍然不知道,如果它是一个环境问题或隐晦的东西错了,我做的方式,所以,直到我可以成立一个独立的环境,自己从头开始,我在十字架上的农场的东西放弃,去回到使用标准的服务器端OM。 – 2012-03-24 16:20:32