2010-10-27 4 views
2

J'utilise ajax pour appeler un service Web qui met à jour une liste de points de partage.Erreur lors de la mise à jour de l'élément Sharepoint List, lorsqu'il est appelé depuis le service Web

Il fonctionne quand je l'appelle le code de tests unitaires, mais l'exécution du code dans un navigateur provoque une exception:

System.InvalidOperationException: Le fonctionnement est pas valide en raison de l'état actuel de l'objet. à Microsoft.SharePoint.WebControls.SPControl.SPWebEnsureSPControl (HttpContext contexte) à Microsoft.SharePoint.WebControls.SPControl.GetContextWeb (HttpContext contexte) à Microsoft.SharePoint.SPContext.get_Current() à Microsoft.SharePoint.SPListItem.AddOrUpdateItem (Boolean badd, Boolean bSystem, Boolean bPreserveItemVersion, Boolean bNoVersion, Boolean bMigration, Boolean bPublish, Boolean bCheckOut, Boolean bCheckin, guid newGuidOnAdd, Int32 & Ulid, objet & objAttachmentNames, objet & objAttachmentContents, booléens suppressAfterEvents) à Microsoft.SharePoint.SPListItem .UpdateInternal (booléen bSystem, bPreserveItemVersion booléenne, Guid newGuidOnAdd, bMigration booléenne, bPublish booléen, bNoVersion booléenne, bCheckOut booléen, Bo Olean bCheckin, booléennes suppressAfterEvents) à Microsoft.SharePoint.SPListItem.Update()

Mon code de mettre à jour l'élément de liste est:

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(); 
        } 
       } 
      } 
     }); 

erreurs sur item.Update Il();

+0

Lorsque vous exécutez le test unitaire, est-il exécuté avec les mêmes informations d'identification de compte que le service Web? Je me demande si c'est un problème de sécurité. – CBono

+0

Il utilise les mêmes informations d'identification pour les deux. –

Répondre

0

Le problème était avec la sécurité. La ligne suivante doit être ajoutée (mais pas idéal)

web.AllowUnsafeUpdates = true; 

J'ai aussi enlevé la ligne

SPSecurity.RunWithElevatedPrivileges(delegate() 

et changé le SPSite et SPWeb de ne pas utiliser « à l'aide ».

+2

Deux choses: d'abord, il serait préférable de définir AllowUnsafeUpdates Retour à false après item.Update Deuxièmement, les utilisations sur SPSite et SPWeb ne devraient pas causer d'erreurs Si vous n'utilisez pas using, alors assurez-vous d'appeler explicitement Dispose sur SPSite et SPWeb, sinon votre application perdra de la mémoire http://msdn.microsoft.com/en-us/library/aa973248(office.12).aspx –

1

Essayez d'ajouter 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

Votre réponse a été utile, elle m'a montré la même erreur SPSecurityException que j'avais avant d'utiliser SPSecurity.RunWithElevatedPrivileges (delegate() donc je savais que je devais supprimer cette ligne.) –

Questions connexes