C# 来自测试服务器的RDO Outlook访问邮箱

C# 来自测试服务器的RDO Outlook访问邮箱,c#,outlook,outlook-redemption,C#,Outlook,Outlook Redemption,我已经开发了一个web应用程序,可以使用Redemption读取邮箱,我们称之为“custom@domain.com". 使用localhost可以很好地工作,但当我部署它时,会出现此异常 错误System.Runtime.InteropServices.COMException(0x80004005): 使用CLSID创建COM组件的实例 来自IClassFactory的{29AB7A12-B531-450E-8F7A-EA94C2F3C05F}失败 由于以下错误:80004005。在 Sy

我已经开发了一个web应用程序,可以使用Redemption读取邮箱,我们称之为“custom@domain.com". 使用localhost可以很好地工作,但当我部署它时,会出现此异常

错误System.Runtime.InteropServices.COMException(0x80004005): 使用CLSID创建COM组件的实例 来自IClassFactory的{29AB7A12-B531-450E-8F7A-EA94C2F3C05F}失败 由于以下错误:80004005。在 System.RuntimeTypeHandle.CreateInstance(RuntimeType类型,布尔值 publicOnly、Boolean noCheck、Boolean&canBeCached、, RuntimeMethodHandleInternal&ctor、Boolean&bNeedSecurityCheck)位于 System.RuntimeType.CreateInstanceSlow(布尔publicOnly,布尔型 skipCheckThis,布尔填充缓存)位于 System.RuntimeType.CreateInstanceDefaultCtor(仅限布尔值), 布尔skipVisibilityChecks,布尔skipCheckThis,布尔 在System.Activator.CreateInstance(类型,布尔值)处 (非公开)

我猜我的服务器正在使用其网络用户作为默认用户登录邮箱,而不是当前访问web应用的windows NT用户。如何让服务器或我的RDO代码使用当前使用RDO应用程序的NT用户?

我已在服务器上安装了MAPI扩展,并在注册表中注册了dll

我的RDO代码如下所示

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

        Session = new RDOSession();//this throws the exception above
        Session.LogonExchangeMailbox("username@domain.com", outLookServer);  
         objFolder = Session.GetDefaultFolder(olFolderInbox);
噩梦(或不推荐)解决方案 正如Dmitry所指出的,我认为问题在于应用程序的局限性。然而,将应用程序转换为32位或64位的问题是,将解决方案中的每个项目转换为使用相同的位,以便应用程序可以使用相同位的MAPI,这是不可避免的、可怕的连锁反应。如果您有其他应用程序使用相同的库和项目,那么这些应用程序也可能会中断,所以说起来容易做起来难。事实上,我试过了,它在很多方面破坏了这个项目……我觉得它不值得

最佳解决方案

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("name@company.com");
对于Exchange Server 2007_SP1及更高版本,我们有一个名为Exchange Web Services MAPI的便捷Web服务,它可以执行与赎回相同的操作…可能没有那么多,但它可以满足您日常outlook的需要。请阅读下载中的指南以了解更多信息

这对我来说是最好的解决方案,因为它不需要任何应用程序来指定一个位,它不需要任何特殊的说明,也没有松散的结尾。一个简单的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("name@company.com");
教程 再次阅读指南或用谷歌搜索。
其他例子

您是否确认上述代码适用于同一服务器上的登录用户(例如通过RDP)?在从web应用尝试之前,您需要让它在控制台或winforms应用程序中为登录用户工作。@Ben为什么在web应用程序之前需要在winform或控制台上测试它?操作系统比特率是多少?您安装了什么版本的Outlook或MAPI?@Dmitry,服务器是64位的,应用程序设置为VS2010 MVC3中的“任意CPU”,因此它可能默认为64位……不过这只是一个猜测。MAPI来自@EKet。在您认为在IIS中运行MAPI有问题之前,您应该确认它在该计算机上是否正常工作。IIS增加了很多额外的注意事项。我怀疑组件注册存在某种问题。正如Dmitry所说,比特度也可能是问题所在,所以请在64位winforms应用程序中进行测试。如果这样做有效,那么就担心IIS配置。您还可以将与MAPI相关的功能包装到一个单独的exe中,以32位和64位进行编译,然后从主可执行文件调用它,无论其位是多少。