0

我想在一个偏僻的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

回答

0

有没有理由不使用标准OM?

你已经说了,这是一个网络的一部分,这意味着它是在应用程序池帐户的上下文中运行。除非您通过切换用户来提升权限,否则将无法正确进行身份验证。也许尝试一下。但是,如果您已经可以访问API,则不会使用客户端OM。

+0

我需要能够进行跨Web应用程序的调用,并在服务器场......我想我可以放弃交叉农场功能,但我更愿意把它。它实际上是在用户控件运行,不是一个Web部件,但我想就它而言,这里几乎没什么不同 - 它们都运行在SPContext中。我想这是值得尝试服务器端API的跨Web应用程序调用,因为我使用Kerberos。今天早上我会试一试。 – 2012-03-16 14:48:08

+0

那么,为了跟进,我无法在该环境中使用客户端OM进行跨农场调用。我仍然不知道,如果它是一个环境问题或隐晦的东西错了,我做的方式,所以,直到我可以成立一个独立的环境,自己从头开始,我在十字架上的农场的东西放弃,去回到使用标准的服务器端OM。 – 2012-03-24 16:20:32

相关问题