我已经构建了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对象?
感谢。
答案 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"];