2010-10-27 2 views
2

Я использую ajax для вызова веб-службы, которая обновляет список sharepoint.Ошибка при обновлении элемента списка Sharepoint при вызове из веб-службы

Он работает, когда я звоню код из модульных тестов, но запуск кода в браузере вызывает исключение:

System.InvalidOperationException: Операция недопустима из-за текущее состояние объекта. в Microsoft.SharePoint.WebControls.SPControl.SPWebEnsureSPControl (HttpContext контекст) в Microsoft.SharePoint.WebControls.SPControl.GetContextWeb (HttpContext контекст) в Microsoft.SharePoint.SPContext.get_Current() в Microsoft.SharePoint.SPListItem.AddOrUpdateItem (Boolean, Boolean Badd bSystem, Boolean, Boolean bPreserveItemVersion bNoVersion, Boolean, Boolean bMigration bPublish, Boolean, Boolean bCheckOut bCheckin, Guid newGuidOnAdd, Int32 & ulID, объект & objAttachmentNames, объект & objAttachmentContents, булевы suppressAfterEvents) в Microsoft.SharePoint.SPListItem .UpdateInternal (Boolean bSystem, Boolean bPreserveItemVersion, Guid newGuidOnAdd, Boolean bMigration, Boolean bPublish, Boolean bNoVersion, Boolean bCheckOut, Bo Олин bCheckin, булевы suppressAfterEvents) в Microsoft.SharePoint.SPListItem.Update()

Мой код для обновления элемента списка:

SPSecurity.RunWithElevatedPrivileges(delegate() 
     { 
      using (SPSite site = new SPSite(siteURL)) 
      { 
       using (SPWeb web = site.OpenWeb(path)) 
       { 
        SPList userProfile = web.Lists[userList]; 
        SPQuery qry = new SPQuery 
        { 
         Query = 
          "<Where><Eq><FieldRef Name='Title' /><Value Type='Text'>" + 
          accountName + 
          "</Value></Eq></Where><ViewFields><FieldRef Name='ID' /><FieldRef Name='Title' /><FieldRef Name='LastUpdated' /><FieldRef Name='Reason' /></ViewFields>" 
        }; 

        SPListItemCollection spListItemCollection = userProfile.GetItems(qry); 

        if (spListItemCollection.Count == 1) 
        { 
         //edit user 
         SPListItem item = spListItemCollection[0]; 
         item["Updated"] = DateTime.Now; 
         item["Reason"] = updateReason; 
         item.Update(); 
        } 
       } 
      } 
     }); 

Она ошибки на item.Update();

+0

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

+0

Он использует те же учетные данные для обоих. –

ответ

0

Проблема была с безопасностью. Следующая строка должна быть добавлена ​​(хотя не идеально)

web.AllowUnsafeUpdates = true; 

Я также удалил линию

SPSecurity.RunWithElevatedPrivileges(delegate() 

и изменил SPSite и SPWeb, чтобы не использовать «с помощью».

+2

Две вещи: во-первых, было бы лучше установить AllowUnsafeUpdates вернемся к false после item.Update. Во-вторых, использование SPSite и SPWeb не должно вызывать никаких ошибок. Если вы не используете использование, то обязательно укажите «Dispose» на SPSite и SPWeb, иначе приложение будет утечки памяти http://msdn.microsoft.com/en-us/library/aa973248(office.12).aspx –

1

Попробуйте добавить this:

HttpContext context = HttpContext.Current; 
if (HttpContext.Current != null) 
{ 
    if (context.Items["HttpHandlerSPWeb"] == null) 
     context.Items["HttpHandlerSPWeb"] = site.RootWeb; 
    if (context.Items["Microsoft.Office.ServerContext"] == null) 
     context.Items["Microsoft.Office.ServerContext"] = ServerContext.GetContext(site); 
} 
+0

Ваш ответ был полезен, он показал мне ту же ошибку SPSecurityException, которая была у меня до того, как я использовал SPSecurity.RunWithElevatedPrivileges (delegate() , поэтому я знал, что мне нужно удалить эту строку. –

Смежные вопросы