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