Ошибка с использованием Sprequest, когда SPWEB уже расположена

sharepoint.stackexchange https://sharepoint.stackexchange.com//questions/41751

  •  09-12-2019
  •  | 
  •  

Вопрос

Это правильный способ использования SPSITE и SPWEB и Splist.

private SPList list;

pulic void getList()
{
using (SPSite site = SPContext.Current.Web.Site.WebApplication.Sites[0])
{
    using (SPWeb web = site.RootWeb)
    {
        SPListCollection lists = web.Lists;
        list = lists.TryGetList("listname");
    }
} 
}

private override void PerformAction()
{
  //retrieving items from the splist
}
.

Я думаю, что из-за этого кода я получаю ошибку:

Обнаружено использование SPREQUEST для ранее закрытого объекта SPWEB. Пожалуйста Закройте объекты SPWEB, когда вы закончите всеми объектами, полученными из их, но не раньше. Трассировка стека: в Microsoft.sharepoint.splistiteMcollection.ensurelistitemsData () ....

Может ли причина быть: что я извлекаю список, а затем так, чтобы избавиться от объекта SPWEB как IM, используя его в использовании предложения, но экземпляр списка все еще там, и я пытаюсь извлечь из него предметы? Я не выполняю никаких действий вставки или обновления только.

И если это потому, что я могу работать вокруг этого? Извлечение списка должно произойти в другом методе, потому что я делаю переопределение метода.

Я преобразовал код к этому, как MSDN говорит RootWeb, я не должен распоряжаться.

 using (SPSite site = new SPSite(SPContext.Current.Site.WebApplication.Sites[0].Url))
{
    SPWeb web = site.RootWeb;
    SPListCollection lists = web.Lists;
    list = lists.TryGetList("listname");
}
.

Все еще есть та же ошибка в журналах

Это было полезно?

Решение

If you would like to work with SharePoint, first at all, you should read this post. It describes how to dispose SharePoint objects.

In the post you can find this:

public void RootWebBestPractice()
{
    // New SPSite.
    using (SPSite siteCollection = new SPSite("http://moss"))
    {
        SPWeb rootWeb1 = siteCollection.RootWeb;
        // No explicit rootWeb1 dispose required.
    }  // siteCollection automatically disposed by implementing using().
    // rootWeb1 will be Disposed by SPSite.

    // SPContext and SPControl
    SPWeb rootWeb2 = SPContext.Current.Site.RootWeb;
    // Also would apply to SPControl.GetContextSite(Context);
    // No explicit rootWeb2 dispose required because it's obtained from SPContext.Current.Site.
}

Другие советы

Just use it like this:

 SPSite currentSite = SPContext.Current.Site;
 SPList mySPList = currentSite.RootWeb.Lists.TryGetList("VoorbeeldLijst");

 if (mySPList != null)
 {
   ...
   ...
 }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с sharepoint.stackexchange
scroll top