2009-06-16 3 views
1

Я создал приложение ASP.NET. Мне нужно использовать SDK стороннего COM-объекта для управления документами. Название приложения «Interwoven». В соответствии с документацией COM-объекта вам следует «Никогда не создавать более одного объекта IMANDMS для каждого приложения».Как управлять доступом COM в приложении ASP.NET

Итак, я решил создать один экземпляр объекта IManDMS и сохранить его в переменной приложения. Вот функция, которую я использую, чтобы получить объект 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 пользователей одновременно запросить страницу, я получаю следующее сообщение об ошибке:

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

Видимо, вы не можете добавить более одного сеанса к объекту IManDMS, с тем же именем, в то же время. Это означает, что я могу открыть только один сеанс для всего приложения в любой момент времени.

Есть ли у кого-либо, кто имеет опыт работы с подобной проблемой, и может предложить предложение о том, как обойти эту проблему, если я не могу создать более одного объекта IManDMS для каждого приложения?

Спасибо.

ответ

2

Вы можете использовать блокировку, чтобы обеспечить одновременный доступ к объекту только одному сеансу. Я не уверен, что делает IManDSM, но основанный на коде, это выглядит как ошибка вызвана

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

Вы добавляете одно имя коллекции сеансов. Можете ли вы попробовать добавить другое имя, например SesssionID, в коллекцию Sessions?

+0

К сожалению, я не могу добавить другое имя. Имя указывает, к какому серверу подключиться. Существует только один сервер. Использование инструкции «lock», похоже, делает трюк. Спасибо за помощь. –

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"]; 
Смежные вопросы