如何在ASP.NET应用程序中管理COM访问

时间:2009-06-16 18:57:02

标签: asp.net com

我已经构建了ASP.NET应用程序。我需要利用第三方COM对象SDK来管理文档。应用程序的名称是“Interwoven”。根据COM对象文档,您应该“永远不要为每个应用程序创建多个IManDMS对象”。

因此,我决定创建一个IManDMS对象实例并将其存储在Application变量中。这是我用来检索IManDMS对象的函数:

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);
…

只有一个人一次请求.ASPX页面时,上述代码才能正常工作。当2个用户同时请求页面时,我收到以下错误:

  

[会话] [添加]项目“SV-TRC-IWDEV”   已存在于集合

显然,您无法同时向IManDMS对象添加多个具有相同名称的会话。这意味着我可以在任何给定时间为整个应用程序打开一个会话。

是否有人有类似问题的经验,可以就如何解决这个问题提出建议,假设我不能为每个应用创建多个IManDMS对象?

感谢。

2 个答案:

答案 0 :(得分:2)

您可以使用锁定以确保只有一个会话同时访问该对象。我不确定IManDSM做了什么,但根据您的代码,看起来错误是由

引起的
IManSession s = dms.Sessions.Add(serverName);

您正在为Sessions集合添加相同的名称。您可以尝试在Sessions集合中添加SesssionID等其他名称吗?

答案 1 :(得分:1)

在ASP.Net中,您可以安全地将每个会话视为自己的应用程序。以下是我多年来使用IManage SDK工具包管理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();
}

这样做的好处是会话设置/拆除链接到ASP.Net会话,该会话可以充分管理会话,并为用户提供一些极好的速度优势。

每当您需要访问Session对象时,只需在ASP.Net页面上使用此代码或回发:

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