2010-09-13 5 views
0

Nous avons créé un service web personnalisé dans Umbraco pour ajouter des fichiers (async) et les télécharger. Après le téléchargement, le service est appelé avec le noeud et les informations de fichier pour ajouter un nouveau noeud à l'arborescence de contenu. Au début, notre principal problème était que le service fonctionnait en dehors du contexte d'Umbraco, ce qui donnait des erreurs étranges avec get_currentuser.Webservice personnalisé dans Umbraco 4.5 donnant une erreur impaire

Maintenant, nous héritons du baseWebService umbraco de la DLL umbraco.webservices et nous avons défini toutes les informations d'accès dans le fichier de paramètres; Nous authentifions avant de faire quoi que ce soit d'autre en utilisant (administrateur correct et moche-codé en dur).

Lorsque nous exécutons maintenant le webservice (à partir du navigateur ou autre) nous obtenons:

at umbraco.DataLayer.SqlHelper`1.ExecuteReader(String commandText, IParameter[] parameters) 
    at umbraco.cms.businesslogic.CMSNode.setupNode() 
    at umbraco.cms.businesslogic.web.Document.setupNode() 
    at umbraco.cms.businesslogic.CMSNode..ctor(Int32 Id) 
    at umbraco.cms.businesslogic.Content..ctor(Int32 id) 
    at umbraco.cms.businesslogic.web.Document..ctor(Int32 id) 
    at FileUpload.AddDocument(String ProjectID, String NodeID, String FileName)* 

Où addDocument est notre méthode. Le nœud (nom de fichier sans extension) n'existe pas dans l'arborescence (pas n'importe où, c'est un nouveau nom de fichier/nœud). Nous avons nettoyé la corbeille, donc ce n'est pas là non plus.

Avons-nous oublié quelque chose de vital, quelqu'un a-t-il une solution?

Voici la source du service Web;

using umbraco.cms.businesslogic.web; 
using umbraco.BusinessLogic; 
using umbraco.presentation.nodeFactory; 
using umbraco.cms.businesslogic.member; 
using umbraco.cms; 

/// <summary> 
/// Summary description for FileUpload 
/// </summary> 
[WebService(Namespace = "http://umbraco.org/webservices/")] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 

public class FileUpload : umbraco.webservices.BaseWebService //System.Web.Services.WebService 
{ 

    private string GetMimeType(string fileName) 
    { 
     string mimeType = "application/unknown"; 
     string ext = System.IO.Path.GetExtension(fileName).ToLower(); 
     Microsoft.Win32.RegistryKey regKey = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(ext); 
     if (regKey != null && regKey.GetValue("Content Type") != null) 
      mimeType = regKey.GetValue("Content Type").ToString(); 
     return mimeType; 
    } 

    [WebMethod] 
    public string HelloWorld() { 
     return "Hello World"; 
    } 


    [WebMethod] 
    public void AddDocument(string ProjectID, string NodeID, string FileName) 
    { 
     Authenticate("***", "***"); 
     string MimeType = GetMimeType(FileName); //"application/unknown"; 

     // Create node 
     int nodeId = 1197; 
     string fileName = System.IO.Path.GetFileNameWithoutExtension(@"*****\Upload\" + FileName); 

     string secGroups = ""; 

//EDIT DUE TO COMMENT: Behavior remains the same though 
     Document node = umbraco.cms.businesslogic.web.Document.MakeNew(fileName.Replace(".", ""), new DocumentType(1049), umbraco.BusinessLogic.User.GetUser(0), nodeId); 


     secGroups = "Intern"; 

     StreamWriter sw = null; 
     try 
     { 
//EXCEPTION IS THROWN SOMEWHERE HERE 
      Document doc = NodeLevel.CreateNode(fileName, "Bestand", nodeId); 
      doc.getProperty("bestandsNaam").Value = fileName; 
      byte[] buffer = System.IO.File.ReadAllBytes(@"****\Upload\" + FileName); 

      int projectId = 0; 
      int tempid = nodeId; 
//EXCEPTION IS THROWN TO THIS POINT (SEE BELOW) 


      try 
      { 
       Access.ProtectPage(false, doc.Id, 1103, 1103); 
       Access.AddMembershipRoleToDocument(doc.Id, secGroups); 
      } 
      catch (Exception ex) 
      { 
     // write to file 
      } 

      try 
      { 
       doc.Publish(umbraco.BusinessLogic.User.GetUser(0)); 
       umbraco.library.UpdateDocumentCache(doc.Id); 

       umbraco.content.Instance.RefreshContentFromDatabaseAsync(); 
      } 
      catch (Exception ex) 
      { 
     // write to file 
      } 
      System.IO.File.Delete(FileName); 

     } 
     catch (Exception ex) 
     { 
      // THIS EXCEPTION IS CAUGHT!! 
     } 
    } 
    public override umbraco.webservices.BaseWebService.Services Service 
    { 
     get { return umbraco.webservices.BaseWebService.Services.DocumentService; } 
    } 
} 

Si quelqu'un a une solution, un pointeur, un indice ou quoi que ce soit; l'aide est appréciée !!

TIA, riffnl

+0

L'erreur semble se produire à la ligne "Document node = new Document (nodeId);" (selon la callstack), où nodeId = 1197. Existe-t-il un noeud avec l'ID 1197 dans votre arborescence de contenu? Pouvez-vous utiliser SQL Server Profiler pour vérifier SQL exécuté? Est-ce qu'il s'exécute sans erreur (et trouve un document?) –

+0

quelle exception est levée? On dirait que seule la trace de la pile est là ... – Jon

+0

@Andreas; tu avais raison. Le document 1197 existait, bien que ce soit censé être son parent. Nous avons modifié le code, le comportement reste le même si – riffnl

Répondre

0

Nous avons réécrit toute la procédure (sous-évaluées tout le code et le redémarrage) et nous l'avons travaille maintenant.

Je pense que nous avons tellement tripoté l'ancien code en essayant de le faire fonctionner qu'il nous manquait quelques problèmes clés, car il fonctionne.

Merci d'avoir réfléchi quand même!

Questions connexes