File 从完整url获取列表名称

File 从完整url获取列表名称,file,sharepoint,download,csom,File,Sharepoint,Download,Csom,我有数百个不同的随机URL,所有文档都在libs中,没有来自不同农场、不同网站集和站点的任何其他参数,目标是从SharePoint下载一个二进制数组文件 例如,传入url= 那么,如何从中获取(a)正确的网站集根url(b)网站根url(c)库根url?我现在想到的唯一方法是慢慢剥离url的每个部分,直到例如Rootfolder不再给出异常。。。或者另一种方法是慢慢地在url的第一部分添加位,直到rootfolder nog longers出现异常,然后查询子网站等。我已经提出了一种工作方法,但

我有数百个不同的随机URL,所有文档都在libs中,没有来自不同农场、不同网站集和站点的任何其他参数,目标是从SharePoint下载一个二进制数组文件

例如,传入url=


那么,如何从中获取(a)正确的网站集根url(b)网站根url(c)库根url?我现在想到的唯一方法是慢慢剥离url的每个部分,直到例如Rootfolder不再给出异常。。。或者另一种方法是慢慢地在url的第一部分添加位,直到rootfolder nog longers出现异常,然后查询子网站等。

我已经提出了一种工作方法,但它似乎很详细,所以任何改进建议都可以通过“下载文件,如果其中一个特定列的值为“是”:

public-void-getDocument(文档文档)
{
//获取文件名
Uri=新的Uri(doc.Uri);
doc.filename=“”;
doc.filename=System.IO.Path.GetFileName(uri.LocalPath);
//字符串fullPathWithoutFileName=docUri.Replace(文件名“”);
//还将包括?a&b so:
字符串[]splitDocUri=doc.uri.Split('/');
字符串fullPathWithoutFileName=“”;
for(int i=0;i
关键是只接受网站的url。 但如果url将以以下格式指定:

http://site/web/documents/file.docx
然后将发生异常
System.Net.WebException

以下示例演示如何从请求Url解析
ClientContext

public static class ClientContextUtilities
{
    /// <summary>
    /// Resolve client context  
    /// </summary>
    /// <param name="requestUri"></param>
    /// <param name="context"></param>
    /// <param name="credentials"></param>
    /// <returns></returns>
    public static bool TryResolveClientContext(Uri requestUri, out ClientContext context, ICredentials credentials)
    {
        context = null;
        var baseUrl = requestUri.GetLeftPart(UriPartial.Authority);
        for (int i = requestUri.Segments.Length; i >= 0; i--)
        {
            var path = string.Join(string.Empty, requestUri.Segments.Take(i));
            string url = string.Format("{0}{1}", baseUrl, path);
            try
            {
                context = new ClientContext(url);
                if (credentials != null)
                    context.Credentials = credentials;
                context.ExecuteQuery();
                return true;
            }
            catch (Exception ex) {}
        }
        return false;
    }

}

因为您的目标是下载一个文件,所以有一种非常简单的方法来完成它,而无需解析url部分

例如,使用:


如果根网站集uri处于打开状态,它会工作吗_http://server/no/no/here ?下载比较好!但是在允许下载之前需要先检查一些专栏。应该,至少我从来没有遇到过任何问题,不管它是否是根网站集
public static class ClientContextUtilities
{
    /// <summary>
    /// Resolve client context  
    /// </summary>
    /// <param name="requestUri"></param>
    /// <param name="context"></param>
    /// <param name="credentials"></param>
    /// <returns></returns>
    public static bool TryResolveClientContext(Uri requestUri, out ClientContext context, ICredentials credentials)
    {
        context = null;
        var baseUrl = requestUri.GetLeftPart(UriPartial.Authority);
        for (int i = requestUri.Segments.Length; i >= 0; i--)
        {
            var path = string.Join(string.Empty, requestUri.Segments.Take(i));
            string url = string.Format("{0}{1}", baseUrl, path);
            try
            {
                context = new ClientContext(url);
                if (credentials != null)
                    context.Credentials = credentials;
                context.ExecuteQuery();
                return true;
            }
            catch (Exception ex) {}
        }
        return false;
    }

}
ClientContext context;
if (ClientContextUtilities.TryResolveClientContext(requestUri, out context, null))
{
     using (context)
     {
         var baseUrl = requestUri.GetLeftPart(UriPartial.Authority);
         var fileServerRelativeUrl = requestUri.ToString().Replace(baseUrl, string.Empty);                  
         var file = context.Web.GetFileByServerRelativeUrl(fileServerRelativeUrl);
         context.Load(file); 
         context.Load(context.Web);
         context.Load(context.Site);
         context.ExecuteQuery();
     }
}
private static void DownloadFile(Uri fileUri, ICredentials credentials, string localFileName)
{
     using(var client = new WebClient())
     {
        client.Credentials = credentials;
        client.DownloadFile(fileUri, localFileName);
     }  
}