2017-09-28 4 views
0

최근 SharePoint CSOM에서 작업 중이며 문서 라이브러리 (업로드/다운로드/메타 데이터 업데이트)에서 파일 처리를 다루었습니다. 나는 파일의 상대 URL, 즉 listitem [ "FileRef"] 또는 listitem.ServerRelativeUrl을 얻는 두 가지 방법을 생각해 냈습니다. 이 링크 a link은 셰어 포인트 필드의 내부 이름 목록을 제공합니다. "Server Relative URL"은 "ServerUrl"로 표시됩니다. 그러나 listitem [ "ServerUrl"] 같은 예외에 액세스하려고하면 예외가 throw됩니다.CSOM - FileRef vs ServerUrl vs sp.listitem.ServerRelativeUrl

속성 또는 필드가 초기화되지 않았습니다. 요청되지 않았거나 요청이 실행되지 않았습니다. 명시 적으로 요청해야 할 수도 있습니다.

  1. 항목 서버 상대 URL에 액세스하는이 3 가지 방법의 차이점은 무엇입니까 :

    Heres는 내 코드 샘플

    using (ClientContext clientContext = new ClientContext(siteUrl)) 
    { 
    clientContext.Credentials = new NetworkCredential("abc", "abc", "cde"); 
    List oList = clientContext.Web.Lists.GetByTitle("abcd"); 
    clientContext.Load(oList); 
    clientContext.ExecuteQuery(); 
    CamlQuery camlQuery = new CamlQuery(); 
    
    ListItemCollectionPosition itemPosition = null; 
    
    conn.Open(); 
    while (true) 
    { 
        camlQuery = new CamlQuery(); 
        camlQuery.ListItemCollectionPosition = itemPosition; 
    
         camlQuery.ViewXml = 
          //@"<View Scope='RecursiveAll'> 
          string.Format(@"<View Scope='RecursiveAll'> 
              <Query> 
               <Where> 
                <And> 
                 <Eq> 
                  <FieldRef Name='FSObjType' /> 
                  <Value Type='Integer'>0</Value> 
                 </Eq> 
                 <In> 
                  <FieldRef Name='FileLeafRef' /> 
                  <Values> 
                   {0} 
                  </Values> 
                 </In>         
                </And> 
               </Where> 
              </Query> 
              <FieldRef Name='FileLeafRef' /><FieldRef Name='FileRef'><FieldRef Name='ServerUrl'> 
              <RowLimit>100</RowLimit> 
              </View>", CAMLcoll); 
    
        ListItemCollection listItems = oList.GetItems(camlQuery); 
    
        clientContext.Load(listItems); 
        clientContext.ExecuteQuery(); 
        itemPosition = listItems.ListItemCollectionPosition; 
    
        foreach (ListItem listItem in listItems) 
        { 
         try 
         { 
          clientContext.Load(listItem, eachitem => eachitem.File.ServerRelativeUrl); 
          clientContext.ExecuteQuery(); 
          string url = listItem["FileRef"].ToString(); //This works 
          url = listItem.ServerRelativeUrl.ToString(); //This works 
          url = listItem["ServerUrl"].ToString(); //This throws exception!! 
         } 
         catch (Exception ex) 
         { 
          MessageBox.Show(ex.ToString()); 
         } 
        } 
        if (itemPosition == null) 
         break; 
        //Debug.Print(itemPosition.PagingInfo); 
    } 
    

    나는 몇 가지 질문이 있습니까?

  2. url = listItem [ "ServerUrl"] ToString()가 실패합니까?

나는 CSOM 프로그래밍에 익숙하지 않으므로 제 실례지만 실례합니다.

감사

만 File 클래스와 모든 ServerRelativeUrl 작품의 아마르

답변

1

첫째.

그래서, 당신의 코드 차이에 관한 첫 번째 질문에 대해서는 listItem.File.ServerRelativeUrl.ToString();

해야한다, 나는 그들이 모두 같은 결과를 줄 생각합니다. 즉, FileRef, listItem.File.ServerRelativeUrlServerUrl은 문서 라이브러리 내 문서의 동일한 서버 상대 경로를 제공합니다.

두 번째 질문에 대해서는 SharePoint CSOM에서 활용할 속성을 명시 적으로로드해야합니다. 몇 가지 기본 속성이 제공되지만 ServerUrl과 같은 특정 속성에 대해서는 명시 적으로로드해야 사용할 수 있습니다.

셋째, 코드가 실행 중이고 각 목록 항목에 대한 데이터를 요청하고 있습니다. 이것은 단순히 필요하지 않습니다. 목록 항목 컬렉션에서 이러한 속성을로드 할 수 있습니다.

코드를 수정하고, 단순화하고 최적화했습니다. 보십시오 :

ListItemCollection listItems = oList.GetItems(camlQuery); 
clientContext.Load(listItems,items => items.Include(
         item => item["FileRef"], 
         item => item.File.ServerRelativeUrl, 
         item => item["ServerUrl"])); 
clientContext.ExecuteQuery(); 

itemPosition = listItems.ListItemCollectionPosition; 

foreach (ListItem listItem in listItems) 
{ 
    try 
    { 

     string url = listItem["FileRef"].ToString(); //This works 
     url = listItem.File.ServerRelativeUrl.ToString(); //This should work 
     url = listItem["ServerUrl"].ToString(); //This will work now 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.ToString()); 
    } 
} 
+0

감사합니다 Gautam. 예, 맞습니다. ServerRelativeUrl은 파일 속성이며 항목 속성을 나열하지 않습니다. 게시물에 대한 코드를 수정하는 동안 그것을 놓쳤습니다. – Amar