Multi-Select поля в списке Sharepoint, используя OWSSVR.dll

Я нахожусь в процессе создания масштабного проекта SSIS для перемещения данных из серии списков Sharepoint в новую реализацию Dynamics CRM (онлайн). Пакет служб SSIS использует источник данных OData для извлечения данных из списков.

В моем списке есть два столбца, которые не отображаются в вызове OData. Эти два столбца имеют значения Multi-Select или Multi-Lookup. Службы REST не поддерживают поля множественного выбора. (Найдено в другом потоке. Методы, которые вы пытаетесь использовать, работают только со столбцами выбора, которые НЕ являются множественным выбором. К сожалению, столбцы множественного выбора не поддерживаются интерфейсом REST. То же самое относится и к SharePoint 2013, очевидно.)

Поэтому мне нужно попытаться получить доступ к данным в этих столбцах в списке SharePoint с помощью OWSSVR.dll. Список, с которым у меня возникают проблемы, дает мне "Эта страница не может быть отображена" или "Этот сайт не доступен" в зависимости от используемого браузера.

Я проверил идентификатор списка, выбрав его из настроек списка. Поскольку это не сработало, я перешел к другому списку SharePoint, который уже перенес, чтобы проверить формат URL. Другой список работает и возвращает данные в формате XML.

Мне интересно, имеет ли OWSSVR.dll такое же ограничение на значения множественного выбора. Есть идеи или предложения?

Psuedo URLS (сайт с ограниченным доступом):

Работает: http://dummy.sharepointSite.Com/cases/_vti_bin/owssvr.dll?Cmd=Display&List={b703d405-48c8-4211-9137-e1b50bdb0330} & XMLDATA = TRUE

Сломан: http://dummy.sharepointSite.Com/cases/_vti_bin/owssvr.dll?Cmd=Display&List={8e148584-b5be-48f5-9343-85d23a7731cc} & XMLDATA = TRUE

1 ответ

Я нашел способ сделать это без использования OWSSVR. Я должен настроить пользовательский контекст на сайте SharePoint, а затем получить список элементов.

Методы:

public static ClientContext SetupSPContext(string documentLibrarySiteURL, 
                        string userName, string password, string domain = "")
{
    ClientContext clientContext = new ClientContext(documentLibrarySiteURL);
    SecureString pwString = new SecureString();

    foreach (char c in password.ToCharArray()) { pwString.AppendChar(c); }
    if (!String.IsNullOrWhiteSpace(domain))
        clientContext.Credentials = new NetworkCredential(userName, pwString, domain);
    else
        clientContext.Credentials = new SharePointOnlineCredentials(userName, pwString);

    Web web = clientContext.Web;
    clientContext.Load(web);
    clientContext.ExecuteQuery();
    return clientContext;
}

public static ListItemCollection GetListItems(ClientContext context, string listName)
{
    ListCollection listCollection = context.Web.Lists;
    List targetList = context.Web.Lists.GetByTitle(listName);

    CamlQuery query = new CamlQuery();
    query.ViewXml = "<Query><OrderBy><FieldRef Name='fieldName' /></OrderBy></Query>";
    ListItemCollection collListItem = targetList.GetItems(query);

    context.Load(collListItem);
    context.ExecuteQuery();

    if (collListItem.Count == 0)
    {
        return null;
    }
    else
    {
        return collListItem;
    }
}

Код в компоненте сценария служб SSIS:

//In the PreExecute method: 
//  Variables were defined for the class and not in the preExecute Method
ClientContext spContext = SetupSPContext(Variables.spLocation, Variables.spUserName, 
                                Variables.spPassword, Variables.spDomain);
ListItemCollection listItems = GetListItems(spContext, "List Name");

//Inside the Individual loop inside SSIS (Input0_ProcessInputRow):
ListItem listItem = GetListItem(listItems, fieldValue);

//Multiple Lookup Code
var values = (FieldLookupValue[])listItem["fieldName"];
var finalValue = "FieldName values:  ";

if (values.Length > 0)
{ 
    foreach (var value in values)
    {
        finalValue = value.LookupValue + "; ";
    }
}

//Multiple Select
if (listItem["fieldName2"] != null)
{
    var valuesTwo = (string[])listItem["fieldName2"];
    string combinedValues = "fieldName2 Values:  ";

    foreach (var value in valuesTwo)
    {
        combinedValues += value + "; ";
    }
}
Другие вопросы по тегам