我的任务是在 .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();

    ...
}

我立刻就面临着两者之间的区别 ExchangeServiceExchangeServiceBinding (“ESB”);所以我开始用谷歌搜索来尝试找出如何获得 ESB 定义,以便 CreateAppointment 方法将编译。我发现 这篇博文 这解释了如何从 WSDL 生成代理类,我就是这么做的。

不幸的是,这导致了一些冲突,其中原始程序集中定义的类型, Microsoft.Exchange.WebServices.dll (随示例代码一起提供)与我的新中的类型重叠 EWS.dll 程序集(我从生成的代码编译的 services.wsdl 由 Exchange 服务器提供)。

我排除了 MEWS 组件,这只会让事情变得更糟。我从少量错误和警告增加到 25 个错误和 2,510 个警告。各种类型和方法都没有找到。这里显然有什么问题。

于是我又回去打猎了。我找到了有关添加服务引用和网络引用的说明(即 VS2008 中需要的额外步骤),我想我又回到了正确的轨道上。

我删除了(实际上,现在只是排除了)我之前尝试过的所有程序集;我添加了一个服务参考 https://my.exchange-server.com/ews/services.wsdl

现在我只剩下 1 个错误和 1 个警告。

警告:
元素“transport”不能包含子元素“extendedProtectionPolicy”,因为父元素的内容模型为空。

这是指当我添加服务引用时对 web.config 所做的更改;我刚刚发现 对此的修复. 。我已经按照指示对该部分进行了评论,它确实使警告消失了,所以为此欢呼。

不过,这个错误并不那么容易解决:

错误:
找不到类型或命名空间名称“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 使用文档?

有帮助吗?

解决方案

我建议转向托管 EWS API。它比尝试自己将所有东西拼凑起来更容易使用。它支持 Exchange 2007 SP1 和 Exchange 2010。我认为您会发现它更容易使用,并且可能会消除您的问题。

版本1:这里是 从微软下载.

这是 MSDN 文档.

对于版本 2(感谢@ruffin!)

下载 - MSDN 文档


由提问者添加:

事实证明有用的其他链接:

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top