Почему я не могу вставить файл в список SharePoint с помощью кода?Это идет в исключение, кажется, что доступ запрещен - PullRequest
0 голосов
/ 25 января 2019

Я очень новичок в SharePoint (я использую SharePoint 2013), и у меня возникла странная проблема. Это очень странно, потому что в другом разделе моего приложения оно работает нормально (на другом дочернем сайте).

Так что в основном в SharePoint у меня есть список SharePoint с именем Protocollo .

Мой код содержит следующие строки, которые добавляют документ (файл) в подпапку предыдущего списка SharePoint:

internal static int InsertItem(Dictionary<string, object> prot, Documento doc, bool assignVisibility, bool newItem)
{
    int state = 0;
    SPListItem item = null;
    UOR currUOR = null;
    List<UOR> path = new List<UOR>();

    SPWeb web = SPContext.Current.Web;
    string siglaAOO = web.Properties["sigla_aoo"];
    DBConnection dbConfig = ArxeiaProtocollo.Util.ProtUtils.InitializeDBConnection();

    dbConfig.Database = siglaAOO;
    string username = web.CurrentUser.LoginName;

    try
    {
        SPList list = web.Lists["Protocollo"];
        web.AllowUnsafeUpdates = true;
        SPFolderCollection folders = list.RootFolder.SubFolders;
        SPFolder annoFolder;
        DateTime dateProt = Convert.ToDateTime(prot["Data protocollo"]);

        try
        {
            annoFolder = folders[dateProt.Year.ToString()];
        }
        catch
        {
            annoFolder = folders.Add(dateProt.Year.ToString());
        }
        SPFolder meseFolder;
        try
        {
            meseFolder = annoFolder.SubFolders[dateProt.Month.ToString("D2")];
        }
        catch
        {
            meseFolder = annoFolder.SubFolders.Add(dateProt.Month.ToString("D2"));
        }
        SPFolder dayFolder;
        try
        {
            dayFolder = meseFolder.SubFolders[dateProt.Day.ToString("D2")];
        }
        catch
        {
            dayFolder = meseFolder.SubFolders.Add(dateProt.Day.ToString("D2"));
        }

        SPFile spFile = dayFolder.Files.Add(doc.Nome, doc.File, true);
        ............................................................
        ............................................................
        ............................................................
}

Как видно из предыдущего кода, получите список Protocollo с текущего веб-сайта, позволяющий обновлять его:

SPList list = web.Lists["Protocollo"];
web.AllowUnsafeUpdates = true;

Затем в этом списке создается (не существует) структура иерархических папок для года (annoFolder), месяца (meseFolder) и дня ( dayFolder ).

Работает нормально, я пытался удалить структуру папок с моего сайта SharePoint, и, выполнив этот метод, он снова создается, но вот что я получил:

enter image description here

Как видите, эта структура папок корректно создается в моем списке SharePoint (с именем Protocollo ) на текущем веб-сайте.

Хорошо, в конце концов мой код пытается вставить документ в последнюю подпапку ( dayfolder ):

SPFile spFile = dayFolder.Files.Add(doc.Nome, doc.File, true);

Я перехожу к методу Add (): имя файла, байтовый массив, представляющий файл, и истинное логическое значение.

The problem is that performing this line I obtain the following exception that is not providing information:

{Unable to evaluate expression because the code is optimized or a native frame is on top of the call stack.}

Затем в моем интерфейсе появляется всплывающее окно «Отказано в доступе».

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

Есть идеи? Что я могу попытаться сделать, чтобы решить эту странную проблему?

1 Ответ

0 голосов
/ 25 января 2019

Коды SharePoint выполняются с использованием пользователя пула приложений в IIS, а не того пользователя, который вы вошли в SharePoint, поэтому обычно появляется ошибка отказа в доступе, даже если у вас доступ. Поэтому я бы посоветовал вам проверить разрешение для учетной записи AppPool в библиотеке Protocollo. Или вы можете использовать SPSecurity.RunWithElevatedPrivileges, если вы доверяете пользователю, который запустит код.

Остерегайтесь ловушек хотя.

Вот пример использования:

Guid siteId = SPContext.Current.Site.ID;
Guid webId = SPContext.Current.Web.ID;

SPSecurity.RunWithElevatedPrivileges(delegate()
{
    using (SPSite site = new SPSite(siteId))
    {
        using (SPWeb web = site.OpenWeb(webId))
        {
            // Your code here
        }
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...