Почтовый ящик доступа RDO Outlook Redemption с тестового сервера

Я создал веб-приложение, которое использует Redemption для чтения почтового ящика, назовем его [email protected]. Он отлично работает с использованием localhost, но когда я его развертываю, я получаю это исключение.

Ошибка System.Runtime.InteropServices.COMException (0x80004005): создание экземпляра COM-компонента с идентификатором CLSID {29AB7A12-B531-450E-8F7A-EA94C2F3C05F} из IClassFactory завершилось неудачно из-за следующей ошибки: 80004005. в System.HandreuntimeType (тип RuntimeType, булева publicOnly, булева NOCHECK, булева & canBeCached, RuntimeMethodHandleInternal & т е р, булева & bNeedSecurityCheck) при System.RuntimeType.CreateInstanceSlow (Boolean publicOnly, Boolean, Boolean skipCheckThis fillCache) в System.RuntimeType.CreateInstanceDefaultCtor (Boolean publicOnly, булевой skipVisibilityChecks, булевой skipCheckThis , Boolean fillCache) в System.Activator.CreateInstance (тип типа, логическое значение nonPublic)

Я предполагаю, что мой сервер использует своего сетевого пользователя в качестве пользователя по умолчанию для входа в почтовый ящик вместо текущего пользователя Windows NT, обращающегося к веб-приложению. Как мне заставить сервер или мой код RDO использовать текущего пользователя NT с помощью приложения с RDO?

Я установил расширение MAPI на свой сервер и зарегистрировал dll в реестре.

Мой код RDO выглядит так

 RDOSession Session = null;
        rdoDefaultFolders olFolderInbox = rdoDefaultFolders.olFolderInbox;

        Session = new RDOSession();//this throws the exception above
        Session.LogonExchangeMailbox("[email protected]", outLookServer);  
         objFolder = Session.GetDefaultFolder(olFolderInbox);

person EKet    schedule 01.02.2012    source источник
comment
Подтвердили ли вы, что приведенный выше код работает для вошедшего в систему пользователя на том же сервере (например, через RDP)? Вам нужно заставить его работать для вошедшего в систему пользователя в консоли или приложении winforms, прежде чем вы попробуете его из веб-приложения.   -  person Ben    schedule 02.02.2012
comment
@Ben, почему это нужно тестировать на winform или консоли перед веб-приложением?   -  person EKet    schedule 02.02.2012
comment
Какая разрядность ОС? Какую версию Outlook или MAPI вы установили?   -  person Dmitry Streblechenko    schedule 02.02.2012
comment
@Dmitry, сервер 64-битный, для приложения установлено значение Any CPU, которое находится в VS2010 MVC3, поэтому по умолчанию может быть 64 ... просто дикая догадка. MAPI находится здесь   -  person EKet    schedule 02.02.2012
comment
@EKet, прежде чем вы предположите, что это проблема с запуском в IIS, вы должны подтвердить, что он работает вообще на этой машине. IIS добавляет много дополнительных соображений. Я подозреваю, что это какая-то проблема с регистрацией компонентов. По словам Дмитрия, битрейт также может быть проблемой, поэтому протестируйте в 64-битном приложении winforms. Если это сработает, тогда беспокойтесь о конфигурации IIS.   -  person Ben    schedule 02.02.2012
comment
Вам необходимо убедиться, что ваш код (под IIS) работает в 32-битном режиме, чтобы соответствовать разрядности системы MAPI, а не ОС: dimastr.com/redemption/faq.htm#ErrorCreatingRedemptionObject   -  person Dmitry Streblechenko    schedule 02.02.2012


Ответы (1)


Кошмар (или не рекомендуется) Решение. Я полагаю, что проблема заключалась в разрядности приложения, как указал Дмитрий. Однако проблема с преобразованием ваших приложений в 32-битную или 64-битную версию - это неизбежная и ужасная цепная реакция преобразования КАЖДОГО проекта в вашем решении для использования одной и той же разрядности, чтобы приложение могло использовать MAPI того же бита. Если у вас есть другие приложения, использующие те же библиотеки и проекты, они также могут сломаться, поэтому легче сказать, чем сделать. Фактически, я попробовал это, и это сломало проект во многих отношениях ... решил, что оно того не стоит.

Лучшее решение

Для Exchange Server 2007_SP1 и выше у нас есть удобный WebService под названием Exchange Web Services MAPI, который делает то же самое, что и Redemption ... может быть, не так много, но он помогает удовлетворить ваши повседневные потребности. Прочтите руководство в загружаемом файле для получения более подробной информации.

http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=13480

Это лучшее решение для меня, потому что оно не требует, чтобы какое-либо приложение указывало бит, оно не требует каких-либо специальных инструкций и не имеет недостатков. Простая DLL, которая делает именно то, что вам нужно, с аутентификацией и даже олицетворением. А кому не нравятся веб-сервисы?

Образец кода

using ExWs = Microsoft.Exchange.WebServices.Data; 

 ExWs.ExchangeService service = new 
                   ExWs.ExchangeService(ExWs.ExchangeVersion.Exchange2007_SP1);
                    service.Credentials = new   
                   ExWs.WebCredentials("username", "password", "domain");
                    service.AutodiscoverUrl("[email protected]");

Руководства Снова прочтите Руководство или погуглите.
другие примеры http://omegacoder.com/?p=454
Загрузить вложение из Exchange с помощью веб-служб Exchange

person EKet    schedule 03.02.2012
comment
Вы также можете обернуть свою функциональность, связанную с MAPI, в отдельный исполняемый файл, который вы можете скомпилировать как в 32-, так и в 64-битном режиме, а затем вызвать его из основного исполняемого файла, независимо от его разрядности. - person Dmitry Streblechenko; 03.02.2012