2009-06-16 9 views
1

J'ai créé l'application ASP.NET. J'ai besoin d'utiliser un SDK d'objet COM tiers pour gérer les documents. Le nom de l'application est "Interwoven". Selon la documentation de l'objet COM, vous devez "Ne jamais créer plus d'un objet IManDMS par application". J'ai donc décidé de créer une instance de l'objet IManDMS et de la stocker dans une variable Application. Voici la fonction que j'utilise pour récupérer un objet IManDMS:Comment gérer l'accès COM dans une application ASP.NET

public static IManDMS GetDMS() 
{ 
    IManDMS dms = HttpContext.Current.Application["DMS"] as IManage.IManDMS; 
    if (dms == null) 
    { 
     dms = new IManage.ManDMSClass(); 
     HttpContext.Current.Application["DMS"] = dms; 
    } 
    return dms; 
} 

… 
// Here is a code snippet showing its use 
IManage.IManDMS dms = GetDMS(); 
string serverName = "myServer"; 
IManSession s = dms.Sessions.Add(serverName); 
s.TrustedLogin(); 

// Do something with the session object, like retrieve documents. 

s.Logout(); 
dms.Sessions.RemoveByObject(s); 
… 

Le code ci-dessus fonctionne très bien quand une seule personne demande la page .ASPX à la fois. Lorsque 2 utilisateurs demandent en même temps que la page que je reçois l'erreur suivante:

[Sessions ][Add ]Item "SV-TRC-IWDEV" already exists in the collection

Apparemment, vous ne pouvez pas ajouter plus d'une session à l'objet IManDMS, avec le même nom, en même temps. Cela signifie que je ne peux avoir qu'une session ouverte, pour l'application entière, à un moment donné.

Y a-t-il quelqu'un qui a de l'expérience avec un problème similaire et qui peut proposer une suggestion pour contourner ce problème, en supposant que je ne peux pas créer plus d'un objet IManDMS par application?

Merci.

Répondre

2

Vous pouvez utiliser un verrou pour vous assurer qu'une seule session accède à l'objet en même temps. Je ne suis pas sûr de ce que IManDSM fait, mais en fonction de votre code, il semble que l'erreur est causée par

IManSession s = dms.Sessions.Add(serverName); 

Vous ajoutez le même nom à la collection Sessions. Pouvez-vous essayer d'ajouter un nom différent comme SesssionID à la collection Sessions?

+0

Malheureusement, je ne peux pas ajouter un autre nom. Le nom indique le serveur auquel se connecter. Il n'y a qu'un seul serveur. L'utilisation de l'instruction "lock" semble faire l'affaire. Merci pour l'aide. –

1

Dans ASP.Net, vous pouvez sans risque considérer chaque session comme sa propre application. Voici la logique que je l'ai utilisé avec le kit SDK iManage pour les années à gérer les sessions dans le fichier Global.asax:

void Session_Start(object sender, EventArgs e) 
{ 
    // Code that runs when a new session is started 
    ManDMS clientDMS = 
     new ManDMSClass(); 
    clientDMS.ApplicationName = "My App Name"; 
    IManSession clientSession = 
     clientDMS.Sessions.Add(
     ConfigurationManager.AppSettings["DMS Server"]); 
    clientSession.MaxRowsForSearch = 750; 
    clientSession.AllVersions = false; 

    // Save the configured session for use by the user 
    Session.Add("Client.Session", clientSession); 

} 

void Session_End(object sender, EventArgs e) 
{ 
    // Code that runs when a session ends. 
    // Note: The Session_End event is raised only when the sessionstate mode 
    // is set to InProc in the Web.config file. If session mode is set to StateServer 
    // or SQLServer, the event is not raised. 
    IManSession clientSession = 
     (IManSession)Session["Client.Session"]; 
    try 
    { 
     if (clientSession.Connected) 
      clientSession.Logout(); 
    } 
    catch (System.Runtime.InteropServices.COMException cex) 
    { 
     // Ignore COMException if user cannot logout 
    } 
    clientSession.DMS.Close(); 
} 

L'avantage à cela est que la configuration de la session/démontage est liée à la session ASP.Net , qui gère de manière adéquate la session, et fournit de grands avantages de vitesse à l'utilisateur.

Chaque fois que vous devez accéder à l'objet de la session, il suffit d'utiliser ce code sur vos pages ASP.Net ou postbacks:

IManSession clientSession = 
     (IManSession)Session["Client.Session"]; 
Questions connexes