none
[WSS 3.0][FR]Détecter l'ouverture d'un fichier dans un workflow. RRS feed

  • Question

  • Bonjour à tous,

    Voici mon problème :
    Je crée un workflow qui crée une tache à la création d'un fichier dans une bibliotheque!
    A l'ouverture de la tâche, j'ai un lien vers le fichier initial du workflow!
    J'aimerai détecter via le code le fait que le fichier soit ouvert!

    J'ai essayer de trouver des infos sur le SPItem, mais je n'ai pas trouvé se qui correspondrait le mieux!

    Merci d'avance.
    lundi 2 novembre 2009 10:18

Réponses

  • Bonjour,

    Il n'y a pas de mécanisme clé-en-main pour ce genre de besoins, mais il y a des contournements possibles!

    Il s'agirait dans la tâche workflow de fournir un lien vers un .asmx qui prendrait en query string l'url du document à télécharger.
    Elle ressemblerait à ça : http://monsite/_layouts/moncode.asmx?url=http://monsite/mondocument.doc
    Le .asmx redirigerait l'utilisateur vers l'url du document par code après avoir exécuté le code à brancher sur l'ouverture du fichier (en .NET)

    Le code n'est alors exécuté que si l'utilisateur passe par le lien indiqué dans la tâche workflow, ce qui peut être bien ou mal selon le cahier des charges. 
    Est-ce que cette solution vous convient ? 

    Si ce n'est pas le cas il faudra sortir l'artillerie lourde :
    - Il y aurait une solution à base de HttpModule qui executerait le code en temps réel mais qui impacterait les performances du serveur, 
    - et une autre à base de tâche planifiée SharePoint qui analyserait des fichiers de log ou des rapports d'utilisation, mais le code ne serait pas exécuté instantanément.

    http://blogs.developpeur.org/anouvel
    Merci de valider les réponses correspondant à l'intitulé des questions afin que ces derniers apparaissent avec l'icone correspondante.
    • Proposé comme réponse Arnault Nouvel lundi 2 novembre 2009 20:43
    • Marqué comme réponse OminiuS mercredi 4 novembre 2009 11:07
    lundi 2 novembre 2009 20:40
  • Bonjour,

    Je viens de réaliser que je vous ai dis une bétise, je voulais dire .ashx et non .asmx!

    Voici un exemple pour un fichier test.ashx :

    <%@ WebHandler Language="C#" Class="Handler" %>
    
    using System;
    using System.Web;
    
    public class Handler : IHttpHandler {
    
        public void ProcessRequest (HttpContext context) {
             
            string url = context.Request["url"];
    
    
    
            /////////////////////////////////////////////
            //Traitement spécifique à mettre ici       
            /////////////////////////////////////////////
    
    
    
            //Redirection vers le fichier cible après le traitement
            context.Response.Redirect(url);
    
        }
    
        public bool IsReusable {
            get {
                return false;
            }
        }
    }
    Si l'utilisateur clique sur un lien vers l'adresse http://monsite/_layouts/test.ashx?url=http://monsite/monfichier.docx, ce handler sera appellé.
    http://blogs.developpeur.org/anouvel
    Merci de valider les réponses qui correspondent à votre problème afin qu'il soit marqué comme solutionné.
    • Marqué comme réponse OminiuS jeudi 5 novembre 2009 09:56
    mercredi 4 novembre 2009 22:30
  • Merci, oui, je comprend mieux!

    Voici mon code :
    Sans oublier dans la console d'administration>operation>Fichier bloqué d'enlever l'extension .ashx de votre site
    <%@ Assembly Name="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
    <%@ WebHandler Language="C#" Class="HandlerRecu" %>
    
    using System;
    using System.Web;
    
    // Mes using
    using Microsoft.SharePoint;
    using Microsoft.SharePoint.WebControls;
    using Microsoft.SharePoint.Workflow;
    using Microsoft.SharePoint.Utilities;
    
    public class HandlerRecu : IHttpHandler
    {
          
        public void ProcessRequest (HttpContext context) {
            string url = context.Request["url"];
            
            // Récupération du SPWeb via le context
            SPWeb _SPWeb = SPContext.Current.Web;
            //autorise les updates en GET
            _SPWeb.AllowUnsafeUpdates = true;
            
            // ID de la bibliothèque de document
            string _paramSPListGuid = _SPWeb.Lists["Fiches demande"].ID.ToString();
            // ID de la fiche
            string _paramListItemID = context.Request["id"];
            // Récupère la liste des fiches, en convertissant le paramètre GUID dans un GUID
            SPList _ListAttachedTo = _SPWeb.Lists[new Guid(_paramSPListGuid)];
            // Récupère la fiche
            SPListItem _ListItem = _ListAttachedTo.GetItemById(System.Convert.ToInt16(_paramListItemID));
    
            //Info item
            _ListItem.Properties["Statut"] = "Reçu";
            _ListItem.Properties["StatutID"] = "2Recu";
            _ListItem.Update();
            _SPWeb.AllowUnsafeUpdates = false;
            
            //Redirection vers le fichier cible après le traitement
            context.Response.Redirect(url);
        }
     
        public bool IsReusable {
            get {
                return false;
            }
        }
    }

    • Marqué comme réponse OminiuS jeudi 5 novembre 2009 09:59
    jeudi 5 novembre 2009 09:58

Toutes les réponses

  • "J'aimerai détecter via le code le fait que le fichier soit ouvert!"

    soit plus explicite. via quel code ?
    lundi 2 novembre 2009 17:33
  • Bonjour,

    Il n'y a pas de mécanisme clé-en-main pour ce genre de besoins, mais il y a des contournements possibles!

    Il s'agirait dans la tâche workflow de fournir un lien vers un .asmx qui prendrait en query string l'url du document à télécharger.
    Elle ressemblerait à ça : http://monsite/_layouts/moncode.asmx?url=http://monsite/mondocument.doc
    Le .asmx redirigerait l'utilisateur vers l'url du document par code après avoir exécuté le code à brancher sur l'ouverture du fichier (en .NET)

    Le code n'est alors exécuté que si l'utilisateur passe par le lien indiqué dans la tâche workflow, ce qui peut être bien ou mal selon le cahier des charges. 
    Est-ce que cette solution vous convient ? 

    Si ce n'est pas le cas il faudra sortir l'artillerie lourde :
    - Il y aurait une solution à base de HttpModule qui executerait le code en temps réel mais qui impacterait les performances du serveur, 
    - et une autre à base de tâche planifiée SharePoint qui analyserait des fichiers de log ou des rapports d'utilisation, mais le code ne serait pas exécuté instantanément.

    http://blogs.developpeur.org/anouvel
    Merci de valider les réponses correspondant à l'intitulé des questions afin que ces derniers apparaissent avec l'icone correspondante.
    • Proposé comme réponse Arnault Nouvel lundi 2 novembre 2009 20:43
    • Marqué comme réponse OminiuS mercredi 4 novembre 2009 11:07
    lundi 2 novembre 2009 20:40
  • Je vais tester votre proposition et vous ferez part de mes éventuels problèmes car je n'ai jamais fait WCF.

    Si vous avez des pistes sur le net que je dois suivre pour arriver à ce résultat!
    mercredi 4 novembre 2009 11:10
  • Bonjour,

    Je viens de réaliser que je vous ai dis une bétise, je voulais dire .ashx et non .asmx!

    Voici un exemple pour un fichier test.ashx :

    <%@ WebHandler Language="C#" Class="Handler" %>
    
    using System;
    using System.Web;
    
    public class Handler : IHttpHandler {
    
        public void ProcessRequest (HttpContext context) {
             
            string url = context.Request["url"];
    
    
    
            /////////////////////////////////////////////
            //Traitement spécifique à mettre ici       
            /////////////////////////////////////////////
    
    
    
            //Redirection vers le fichier cible après le traitement
            context.Response.Redirect(url);
    
        }
    
        public bool IsReusable {
            get {
                return false;
            }
        }
    }
    Si l'utilisateur clique sur un lien vers l'adresse http://monsite/_layouts/test.ashx?url=http://monsite/monfichier.docx, ce handler sera appellé.
    http://blogs.developpeur.org/anouvel
    Merci de valider les réponses qui correspondent à votre problème afin qu'il soit marqué comme solutionné.
    • Marqué comme réponse OminiuS jeudi 5 novembre 2009 09:56
    mercredi 4 novembre 2009 22:30
  • Merci, oui, je comprend mieux!

    Voici mon code :
    Sans oublier dans la console d'administration>operation>Fichier bloqué d'enlever l'extension .ashx de votre site
    <%@ Assembly Name="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
    <%@ WebHandler Language="C#" Class="HandlerRecu" %>
    
    using System;
    using System.Web;
    
    // Mes using
    using Microsoft.SharePoint;
    using Microsoft.SharePoint.WebControls;
    using Microsoft.SharePoint.Workflow;
    using Microsoft.SharePoint.Utilities;
    
    public class HandlerRecu : IHttpHandler
    {
          
        public void ProcessRequest (HttpContext context) {
            string url = context.Request["url"];
            
            // Récupération du SPWeb via le context
            SPWeb _SPWeb = SPContext.Current.Web;
            //autorise les updates en GET
            _SPWeb.AllowUnsafeUpdates = true;
            
            // ID de la bibliothèque de document
            string _paramSPListGuid = _SPWeb.Lists["Fiches demande"].ID.ToString();
            // ID de la fiche
            string _paramListItemID = context.Request["id"];
            // Récupère la liste des fiches, en convertissant le paramètre GUID dans un GUID
            SPList _ListAttachedTo = _SPWeb.Lists[new Guid(_paramSPListGuid)];
            // Récupère la fiche
            SPListItem _ListItem = _ListAttachedTo.GetItemById(System.Convert.ToInt16(_paramListItemID));
    
            //Info item
            _ListItem.Properties["Statut"] = "Reçu";
            _ListItem.Properties["StatutID"] = "2Recu";
            _ListItem.Update();
            _SPWeb.AllowUnsafeUpdates = false;
            
            //Redirection vers le fichier cible après le traitement
            context.Response.Redirect(url);
        }
     
        public bool IsReusable {
            get {
                return false;
            }
        }
    }

    • Marqué comme réponse OminiuS jeudi 5 novembre 2009 09:59
    jeudi 5 novembre 2009 09:58