2017-07-04 50 views

回答

1

在大多数情况下,例如:

  • 文件夹URL,例如https://contoso.sharepoint.com//Documents/Forms/AllItems.aspx?RootFolder=%2FDocuments%2FArchive
  • 列表项URL,例如https://contoso.sharepoint.com/Lists/ShoppingCart/DispForm.aspx?ID=9
  • list/library url,例如https://contoso.sharepoint.com/Lists/Announcements
  • 页面网址,例如https://contoso.sharepoint.com/Lists/Announcements/Newsletter.aspx

下面的例子演示如何确定客户对象类型:

using System; 
using System.Linq; 
using System.Linq.Expressions; 
using System.Net; 
using System.Web; 
using Microsoft.SharePoint.Client; 

namespace O365Console 
{ 
    static class ClientObjectExtensions 
    { 
     public static ClientObject ResolveClientObjectFromUrl(string resourceUrl, ICredentials credentials) 
     { 
      ClientObject targetObject = null; 
      var resourceUri = new Uri(resourceUrl); 
      using (var rootCtx = new ClientContext(resourceUri.Scheme + Uri.SchemeDelimiter + resourceUri.Host)) 
      { 
       rootCtx.Credentials = credentials; 
       var webUrl = Web.WebUrlFromPageUrlDirect(rootCtx, resourceUri); 
       using (var ctx = new ClientContext(webUrl.ToString())) 
       { 
        ctx.Credentials = credentials; 

        var queryBag = System.Web.HttpUtility.ParseQueryString(resourceUri.Query); 
        if (queryBag["Id"] != null) 
        { 
         var listUrl = string.Join(string.Empty, 
          resourceUri.Segments.Take(resourceUri.Segments.Length - 1)); 
         var list = ctx.Web.GetList(listUrl); 
         targetObject = TryRetrieve(() => list.GetItemById(Convert.ToInt32(queryBag["Id"]))); 
        } 
        else if (queryBag["RootFolder"] != null) 
        { 
         var folderUrl = HttpUtility.UrlDecode(queryBag["RootFolder"]); 
         targetObject = TryRetrieve(() => ctx.Web.GetFolderByServerRelativeUrl(folderUrl)); 
        } 
        else if (queryBag.Count > 0) 
        { 
         throw new Exception("Unsupported query string parameter found"); 
        } 
        else 
        { 

         targetObject = TryRetrieve(() => ctx.Web.GetFileByServerRelativeUrl(resourceUri.AbsolutePath)); 
         if (targetObject == null) 
         { 
          targetObject = TryRetrieve(() => ctx.Web.GetList(resourceUri.AbsolutePath),list => list.RootFolder); 
          if (targetObject == null || ((List)targetObject).RootFolder.ServerRelativeUrl != resourceUri.AbsolutePath) 
           targetObject = TryRetrieve(() => ctx.Web.GetFolderByServerRelativeUrl(resourceUri.AbsolutePath)); 
         } 
        } 
       } 
      } 
      return targetObject; 
     } 


     private static T TryRetrieve<T>(Func<T> loadMethod, params Expression<Func<T,object>>[] retrievals) where T : ClientObject 
     { 
      try 
      { 
       var targetObject = loadMethod(); 
       targetObject.Context.Load(targetObject, retrievals); 
       targetObject.Context.ExecuteQuery(); 
       return targetObject; 
      } 
      catch 
      { 
      } 
      return default(T); 
     } 
    } 
} 

使用

var credentials = GetCredentials(userName, password); 
var clientObj = ClientObjectExtensions.ResolveClientObjectFromUrl("https://contoso.sharepoint.com/Lists/Announcements", credentials); 
Console.WriteLine(clientObj.GetType().Name); 

其中

static ICredentials GetCredentials(string userName,string password) 
{ 
     var securePassword = new SecureString(); 
     foreach (var c in password) 
     { 
      securePassword.AppendChar(c); 
     } 
     return new SharePointOnlineCredentials(userName, securePassword); 
} 
+1

非常感谢您的回答!你能告诉我什么时候if(queryBag [“RootFolder”]!= null)中的代码会被执行吗?我尝试了几个不同的网址,但从来没有达到这个代码。不幸的是,这段代码给出了相同的答案 - 列表 - 文件夹,网页和列表。 .../Shared%20Documents/folder1,https://xxx.sharepoint.com/sites/Nested1/subsite1,../Lists/List1但是对列表项和文件工作正常。 –

+0

@Natalie,关于这样的'https:// mediadev19.sharepoint.com/Documents/Archive'这样的url,它确实无法正确地检测文件夹类型'Archive',而是返回'Documents'列表类型。答案已经更新以反映这种情况。 –