我被要求使用.Net编写一个SOAP Web服务,作为EWS2010和应用服务器之间的中间件,前者以前使用WebDAV连接到Exchange。(据我所知,随着EWS2010的推出,WebDAV即将消失,因此应用服务器将无法像以前那样连接,而且没有WebDAV连接到EWS是非常困难的。理论上,用.Net实现应该比其他任何方法都容易...对吗?!)
我的最终目标是能够为指定的Exchange账户获取和创建/更新电子邮件、日历项、联系人和待办事项。(删除当前并不是必需的,但如果足够简单,我可能会在未来考虑加入它)。
起初我得到了一些示例代码,它确实可以工作,但我很快意识到它已经过时了。使用的类型和类在当前文档中找不到。例如,用于创建与Exchange服务器连接的方法为:
ExchangeService svc = new ExchangeService();
svc.Credentials = new WebCredentials(AuthEmailAddress, AuthEmailPassword);
svc.AutodiscoverUrl(AutoDiscoverEmailAddress);
就我所知,这是使用示例代码附带的程序集:Microsoft.Exchange.WebServices.dll
("MEWS")。
在意识到这不是当前标准的连接方式之前,我曾尝试在其基础上构建并添加了一个创建日历项的方法,该方法我从此处复制:
static void CreateAppointment(ExchangeServiceBinding esb)
{
// Create the appointment.
CalendarItemType appointment = new CalendarItemType();
...
}
一开始,我就遇到了ExchangeService
和ExchangeServiceBinding
("ESB")之间的区别;所以我开始谷歌搜索,试图找出如何获得ESB定义,使CreateAppointment
方法可以编译。我发现了这篇博客文章,它解释了如何从WSDL生成代理类,我也做到了。
不幸的是,这引起了某些冲突,在原始程序集Microsoft.Exchange.WebServices.dll
(随示例代码提供)中定义的类型与我的新EWS.dll
程序集中的类型重叠(我从Exchange服务器提供的services.wsdl
生成的代码编译而成)。
我排除了MEWS程序集,结果只让事情变得更糟。我从几个错误和警告变成了25个错误和2510个警告。所有种类的类型和方法都无法找到。显然有些问题。
所以我重新寻找线索。我找到了添加服务引用和Web引用的说明(即在VS2008中所需的额外步骤),我认为我又回到了正确的轨道上。
我删除了之前尝试过的所有程序集(实际上,现在只是排除了它们);并添加了一个服务引用https://my.exchange-server.com/ews/services.wsdl
现在只剩下1个错误和1个警告。
警告:
元素'transport'不能包含子元素'extendedProtectionPolicy',因为父元素的内容模型为空。
这是关于当我添加服务引用时对web.config所做的更改的参考;我刚刚在SO上找到了修复方法。正如指示的那样,我已将该部分注释掉,确实使警告消失了,真不错。
然而,错误却不那么容易解决:
错误:
找不到类型或命名空间名称“ExchangeService”(是否缺少using指令或程序集引用?)
这是与我用来创建EWS连接的函数有关的,该函数由每个Web方法调用:
private ExchangeService getService(String AutoDiscoverEmailAddress, String AuthEmailAddress, String AuthEmailPassword)
{
ExchangeService svc = new ExchangeService();
svc.Credentials = new WebCredentials(AuthEmailAddress, AuthEmailPassword);
svc.AutodiscoverUrl(AutoDiscoverEmailAddress);
return svc;
}
这个函数在示例代码中的MEWS装配件上完美地运作,但是ExchangeService
类型不再可用(我检查过的第一件事情也不是ExchangeServiceBinding
)。
现在,由于我没有按照文档中的任何指示(我在文档中找不到任何关于添加服务引用到您的Exchange服务器的services.wsdl的内容 - 但那似乎是迄今为止最好/最远的进展),我感觉自己像一个盲人。
我知道我需要找出应该替换ExchangeService
/ ExchangeServiceBinding
的内容,实施并解决由此切换引起的任何错误......
但是我不知道如何做到这一点,或者在哪里寻找如何做到这一点的信息。谷歌“ExchangeService”和“ExchangeServiceBinding”似乎只会导致过时的博客文章和MSDN,迄今为止都没有什么帮助。
我应该用什么来替换ExchangeService
/ ExchangeServiceBinding
?有没有其他比MSDN更好的文档介绍使用EWS?