我的任务是在 .Net 中编写一个 SOAP Web 服务,作为 EWS2010 和以前使用 WebDAV 连接到 Exchange 的应用程序服务器之间的中间件。(据我了解,WebDAV 将随着 EWS2010 消失,因此应用程序服务器将不再能够像以前那样连接,并且在没有 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
and ExchangeServiceBinding
("ESB");之间的区别。所以我开始谷歌搜索,试图找出如何获得 ESB 定义,以便CreateAppointment
编译该方法。我发现这篇博客文章解释了如何从 WSDL 生成代理类,我这样做了。
不幸的是,这导致了一些冲突,其中在原始程序集中定义的类型Microsoft.Exchange.WebServices.dll
(示例代码附带)与我的新程序集中的类型(我从Exchange 服务器提供EWS.dll
的代码生成的代码编译)重叠。services.wsdl
我排除了 MEWS 组件,这只会让事情变得更糟。我从少数错误和警告变成了 25 个错误和 2,510 个警告。各种类型和方法都没有找到。明显有问题,这里。
于是我又回去打猎了。我找到了关于添加服务引用和网络引用的说明(即它在 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
?是否有其他位置可以记录与 EWS 一起使用的文档比 MSDN 更好?