SPWeb избавляется от себя и вызывает исключение - PullRequest
0 голосов
/ 21 сентября 2009

При попытке использовать SPWeb.GetSiteData(SPSiteDataQuery) (пытаясь связать некоторые данные с SPGridView) он выдает мне TargetInvocationException со следующей трассировкой стека:

Исключение

  at System.RuntimeMethodHandle._InvokeMethodFast(Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner)
   at System.RuntimeMethodHandle.InvokeMethodFast(Object target, Object[] arguments, Signature sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   at System.Web.UI.WebControls.ObjectDataSourceView.InvokeMethod(ObjectDataSourceMethod method, Boolean disposeInstance, Object& instance)
   at System.Web.UI.WebControls.ObjectDataSourceView.ExecuteSelect(DataSourceSelectArguments arguments)
   at System.Web.UI.DataSourceView.Select(DataSourceSelectArguments arguments, DataSourceViewSelectCallback callback)
   at System.Web.UI.WebControls.DataBoundControl.PerformSelect()
   at System.Web.UI.WebControls.BaseDataBoundControl.DataBind()
   at System.Web.UI.WebControls.GridView.DataBind()
   at Balticovo.SharePoint.WebParts.CrossSiteDataQueryWebPart.OnLoad(EventArgs e)

Метод, которыйбыть вызванным GetData.После исследования InnerException с сообщением Exception from HRESULT: 0x80020009 (DISP_E_EXCEPTION)) похоже, что SharePoint хочет высвободить ресурсы где-то:

   at Microsoft.SharePoint.Library.SPRequest.ReleaseResources()
   at Microsoft.SharePoint.SPRequestManager.Release(SPRequest request)
   at Microsoft.SharePoint.SPWeb.Invalidate()
   at Microsoft.SharePoint.SPWeb.Close()
   at Microsoft.SharePoint.SPWeb.Dispose()
   at Balticovo.SharePoint.Extensions.GetCrossSiteData(SPWebApplication webApp, SPCrossSiteDataQuery query)
   at Balticovo.SharePoint.TasksTableAdapter.GetData(Guid queryId, Boolean dataForOutlook)
   at Balticovo.SharePoint.TasksTableAdapter.GetData(Guid queryId)

Но все эти методы вплоть до SPWeb.Dispose () я ничего не удаляю до вызова SPWeb.GetSiteData(SPSiteDataQuery), который затем генерирует исключение.

Мой код

Экземпляр SPWebApplication, я получаю вот так - Microsoft.SharePoint.WebControls.SPControl.GetContextWebApplication(HttpContext.Current);

Затем я делаю что-то подобное в функции GetCrossSiteData:

foreach (string siteUrl in query.QuerySites)
{
   try
   {
      using (SPSite site = new SPSite(siteUrl))
      using (SPWeb web = site.OpenWeb())
      {
         DataTable dt = web.GetSiteData(query.SiteDataQuery); //Hangs here
         ....
      }
   }
}

Есть идеи?Спасибо.

1 Ответ

0 голосов
/ 21 сентября 2009

Оказывается, причина была в том, что для некоторых списков свойство TemplateFeatureId было установлено на шаблон, который на самом деле не существует или был каким-то образом изменен. Как и в моем случае, я просто воссоздал эти списки, и теперь запросы выполняются нормально.

Обнаружил это по этой статье: http://blog.myitechnology.com/2009/06/fixing-feature-guid-for-list-template.html

Просто НЕ ИСПОЛЬЗУЙТЕ этот инструмент для решения проблемы - он говорит, что он изменяет базу данных контента (я полагаю, напрямую). Это нет-нет-нет. Я только использовал это, чтобы видеть, у каких списков есть проблема.

...