WCF Exchange Server 邮件传输

更新:2007 年 11 月

用于 Microsoft Exchange Server 的 Windows Communication Foundation (WCF) 邮件传输通过使用基于电子邮件地址的 WCF 终结点提供排队服务。利用此解决方案,只要可以访问电子邮件服务器,.NET Compact Framework 和 .NET Framework 应用程序便可以在任何计算机上承载和使用 Web 服务。

说明:

.NET Compact Framework 3.5 版和更高版本中支持 WCF。

此功能可用于实现多种应用程序方案,包括:

  • 需要从域将安全通信发送回中央服务器并从该服务器接收安全通信的应用程序。

  • 将数据从企业服务器推送到域中的设备的应用程序。

  • 两个或更多个设备之间可以直接对话的对等应用程序。

    在这些方案中,多方之间的状态信息通信是通过将电子邮件服务器用作中介来实现的。例如,在典型的游戏方案中,一个玩家通过向应用程序提供电子邮件地址或组别名,向其他玩家发送游戏邀请。

  • 用于查找丢失的设备的应用程序。

  • 通过向设备推送数据为其他应用程序更新配置信息的应用程序。

WCF Exchange Server 邮件传输突破了域中设备的两个基本限制:可寻址性以及在设备处于脱机状态时为数据排队的能力。WCF 终结点地址由信道名称和电子邮件地址组成。这类似于基于套接字的应用程序中的 IP 地址和端口号。设备的可寻址性由电子邮件地址提供,应用程序实例的可寻址性则通过输入信道名称获得。WS-Addressing 协议用于实现此自定义寻址方案。

排队由安装了 Windows Mobile 的设备中的本地数据存储区提供支持。有关 WCF 队列的常规信息,请参见队列概述

基于 WCF Exchange Server 邮件传输构建的应用程序可以从 WCF 的各项基本功能中获益。WCF 为各种基础协议和传输提供了一个统一的编程模型,并能够将应用程序逻辑与 WCF 终结点分开。此编程模型可提供多种好处,包括支持多种不同的网络,例如通用分组无线业务 (GPRS)、Wi-Fi 以及可以访问电子邮件服务器的任何其他网络。使用 WCF Exchange Server 邮件传输开发应用程序与使用 HTTP 信道等 WCF 信道开发应用程序非常相似。

要求

基于 WCF 邮件传输的应用程序的电子邮件服务器是 Exchange Server 2007。Exchange Server 2007 Service Pack 1 提供了一项管理任务,可用于将服务通信重定向到 WCF 电子邮件的单独文件夹中。

说明:

在不重定向的情况下,服务通信使用“收件箱”。

设备和台式计算机都支持这种邮件传输。

设备上需要安装 CE 消息处理 API (CEMAPI) 才能支持排队。安装有 Windows Mobile 的设备上提供了 CEMAPI,但安装有 Windows Embedded CE 的设备上则没有 CEMAPI。

Windows Mobile 5.0 版和更高版本支持 WCF Exchange Server 邮件传输。在 Windows Mobile 5.0 版(内部版本号为 14847.2.0)之前的版本中,系统使用 Systems Management Server (SMS) 而不是 Direct Push 来强制与 Exchange 电子邮件服务器同步。

说明:

另外,Windows Mobile 2003 for Pocket PC 和 Windows Mobile 2003 Second Edition for Pocket PC 也支持这种邮件传输。但是,如果设备运行的是 Windows Mobile 5.0 版之前的版本,传入邮件的 ActiveSync 同步期将并不始终按计划开始。对于这些设备,我们建议在调用 Receive 方法时不指定超时,或指定较大的超时值。不支持 Windows Mobile 2003 for Smartphone。

  • 台式计算机与电子邮件服务器之间的通信直接通过 Exchange Server 2007 Web 服务进行。台式计算机不支持排队。因此,台式计算机必须始终处于联机状态。

  • 桌面上的应用程序使用 WCF 的桌面实现。

体系结构

消息处理层基于标准桌面 WCF 体系结构。不存在服务运行时层。下面的插图显示了信道堆栈以及支持的协议和绑定元素。

WCF Exchange Server 邮件传输的消息处理层

Exchange Server 邮件传输的消息层

对 WS-Security 规范 1.0 版的支持包括使用 X.509 证书的 SOAP 邮件安全性。

Message 类基于 WS-Addressing 标准构建。所有邮件都是异步的;它们只是通过电子邮件服务器从一个设备传输到另一个设备,而不进行反向传输。

邮件的序列化和反序列化在 .NET Compact Framework 或 .NET Framework 运行库内部处理。在设备端,应用程序中必须使用自定义序列化程序。桌面则无此要求,因为整个 .NET Framework 都支持 DataContractSerializer 类。但是,如果应用程序支持设备与桌面之间的通信,则桌面上也应使用设备中使用的序列化程序。

设计

对于 WCF Exchange Server 邮件传输,WCF 终结点由 WCF 绑定和终结点地址一起表示。WCF 绑定指定通信使用的参数。它表示一个绑定元素集合,其中包括传输绑定元素、编码绑定元素和安全绑定元素。对于使用邮件传输的应用程序,这些元素的定义如下:

除了实例化 CustomBinding 对象中的绑定元素集之外,应用程序还可以使用派生自 MailBindingBase 对象的类创建预定义的绑定元素集合。此类不仅包括电子邮件传输绑定元素,还包括文本编码绑定元素以及可选的邮件安全性。

邮件可以包含在电子邮件正文中,也可以用附件形式发送。邮件的“主题”行包含信道名称。邮件用自定义的 WCF 电子邮件信道戳标识,后者由 Exchange Server 使用的邮件类提供。

发送邮件

应用程序发送邮件时,将对当前的输出信道调用 Send 方法,该信道必须处于打开状态。输出信道会将邮件序列化为一个字符串,并在“草稿”文件夹中创建邮件。它会在各个电子邮件字段中设置相应的值。邮件创建完毕后,将被移至“发件箱”。这是通过设备中的 CEMAPI 或桌面上的 Exchange Web 服务来完成的。在设备上,“发件箱”中的邮件将按照 ActiveSync 的定义与其他传出邮件同步。

接收邮件

当基于 WCF Exchange Server 邮件传输的应用程序接收邮件时,将发生以下过程:

  1. 应用程序打开输入信道。

  2. 输入信道调用 Receive 方法,以开始侦听邮件。

  3. 当 Exchange 电子邮件服务器收到带有 WCF 电子邮件信道戳的邮件时,它会自动将该邮件传送至“服务电子邮件”文件夹,此文件夹与“收件箱”处于同一级别。

    说明:

    如果 Exchange 电子邮件服务器未配置为将 WCF Exchange Server 服务邮件传送至“服务电子邮件”文件夹,它将改用“收件箱”。

  4. 正在侦听新邮件事件的输入信道会检查到达“服务电子邮件”或“收件箱”文件夹中的每一封邮件。

    输入信道在侦听邮件时会阻止代码。

  5. 如果输入信道与邮件中的特定信道名称匹配,它将检索该邮件并取消对代码的阻止。

对于基于同一传输构建的多个输入信道,可以调用 Receive 方法。只有对同一线程上的同一输入信道第二次调用 Receive 时才会发生阻止。

说明:

每个信道侦听器只能与一个输入信道关联。只有第一个输入信道关闭后,对信道侦听器的 AcceptChannel 方法的第二次调用才会返回。

为了获得更大的灵活性,可以将电子邮件传输配置为对不同大小的邮件采用不同的处理方法。例如,根据邮件的大小,可以将邮件作为附件发送,也可以将其包括在电子邮件正文中发送。初始同步期间,可能无法完全下载较大的邮件。在设备上,“服务电子邮件”或“收件箱”文件夹中的邮件将按照 Microsoft ActiveSync 所定义的那样与其他传入邮件同步。

说明:

对于设备,ActiveSync 电子邮件同步设置将控制最初下载到该设备上的每封邮件的最大大小。如果邮件超过此大小,则最初只会下载该邮件正文的一部分。如果只下载了部分邮件而信道侦听器正在等待该邮件,则传输将标记该邮件以指示必须将其完整下载。在下次同步会话中,将下载完整的邮件。

收到邮件时,通过使用 Message 类中的 FromEmailAddress 自定义属性,可以获取发送方的电子邮件地址。下面的示例演示如何使用此属性。

System.ServiceModel.Channels.Message m;
String senderAddress;
m = input.Receive();
senderAddress = m.Properties.ContainsKey("FromEmailAddress")

删除邮件

当应用程序收到请求的邮件后,传输会立即删除该邮件。在处理完传入邮件后删除这些邮件的过程因平台而异。

在安装有 Windows Mobile 的设备上,删除传入邮件的过程包括下列步骤:

  1. 输入信道调用 Receive 方法后检索某邮件。

  2. 邮件传输发出调用,以便从安装有 Windows Mobile 的设备上的邮件存储区中删除该邮件。

  3. 在下次电子邮件同步期间,将从服务器上删除该邮件。

在桌面上,删除传入邮件的过程包括下列步骤:

  1. 输入信道调用 Receive 方法后检索某邮件。

  2. 邮件传输将该邮件置于已删除邮件的缓存中,此缓存是邮件传输拥有的内部缓存。

  3. 在下次查询间隔期间,邮件传输将检查已删除邮件的缓存。

    查询间隔由 ServerQueryInterval 属性决定。

  4. 如果已删除邮件的缓存中含有任何邮件,邮件传输将向服务器发出一个含有删除命令的查询,以删除该缓存中的邮件。

  5. 在查询期间,邮件传输将检查服务器事件,并下载所有关联的邮件。

  6. 邮件传输将所有已下载的邮件发送至它的处理缓存,以供应用程序处理。

在桌面上,如果出现下列情况,邮件传输还会向服务器发出一个命令,以删除已删除邮件的缓存中的邮件:

  • 对与邮件传输关联的最后一个保持打开状态的输入信道调用 Close 方法时。

  • 对邮件传输调用 Dispose 方法时。

这些操作是同步的;CloseDispose 会阻止代码,直至从服务器中删除邮件。根据必须要删除的邮件数目,删除邮件所需的时间会有所不同。如果在执行此过程期间发生失败,传输还将进行多次尝试,以删除这些邮件。

在安装有 Windows Mobile 的设备上,此功能由邮件存储区处理。

当邮件无效或格式不正确时,也会删除它们。SOAP 信封已损坏的邮件将被视为无效邮件,并将永久删除。在邮件的主题行中,如果 WCF 电子邮件信道戳后跟有错误的信息,例如信道名称中含有不受支持的字符,则此邮件将被视为格式不正确的邮件。这类邮件将被移至“已删除”文件夹中。

默认设置

MailBindingBase 类及其派生类表示一个预定义绑定元素集合。这些类旨在使输入和输出信道的创建过程更简单。在某些方案中,可能需要更改这些预定义集合中的默认值。如果必须更改的属性不存在于 MailBindingBase 或所使用的派生类中,则可以在 CustomBinding 对象中单独创建该绑定元素。另外,还可以调用 CreateBindingElements 方法,以返回 MailBindingBase 中的所有绑定元素。

例如,在 ExchangeWebServiceMailBinding 类中,已接收邮件的默认最大邮件大小是 65,536 字节。通过使用以下代码设置 MaxReceivedMessageSize 属性,可以将该最大大小增加至 100,000 字节。

binding = new ExchangeWebServiceMailBinding(Server, Credential, MailSecurityMode.Message);
bindingElems = binding.CreateBindingElements();
bindingElems.Find<ExchangeWebServiceMailTransportBindingElement>().MaxReceivedMessageSize = 100000;
binding = new CustomBinding(bindingElems);

安全性

基于 WCF Exchange Server 邮件传输的应用程序支持基于 WS-Security 协议的 SOAP 邮件安全性,后者类似于 HttpTransportBindingElement 类支持的桌面安全功能。此安全功能依赖 X.509 证书。

如果使用 MailBindingBase 对象子类中预定义的绑定元素集合,则可以获得邮件安全性,但默认情况下会禁用此功能。若要启用安全性,请使用 Mode 属性。通过使用 AlgorithmSuite 属性,可以更改默认加密算法。启用安全性时,默认值为 Basic256Rsa15

在使用 WCF Exchange Server 邮件传输的应用程序中,受支持的安全绑定元素是 SecurityBindingElementAsymmetricSecurityBindingElement

说明:

使用邮件安全性会增大每封邮件的大小。如果要使用 ExchangeWebServiceMailBinding 类,并且邮件超过 45,000 字节,则可能需要增大 MaxReceivedMessageSize 属性的值。上一节中的代码示例演示如何增大邮件的最大大小。

部署

在设备部署过程中,将使用 .NET Compact Framework CAB 文件为安装有 Windows Mobile 的设备提供 WCF Exchange Server 邮件传输 DLL。托管程序集安装在全局程序集缓存中。

设备的邮件传输 DLL 包括:

  • Microsoft.ServiceModel.Channels.Mail.dll

  • Microsoft.ServiceModel.Channels.Mail.WindowsMobile.dll

  • Netcfmail3_5.dll,这是一个 CEMAPI 本机包装

此外,设备上还必须有 .NET Compact Framework WCF DLL。

桌面部署通过 .NET Compact Framework .msi 安装文件处理。默认情况下会安装 WCF Exchange Server 邮件传输功能。邮件传输程序集安装在桌面的全局程序集缓存中。

桌面的 WCF Exchange Server 邮件传输 DLL 包括:

  • Microsoft.ServiceModel.Channels.Mail.dll

  • Microsoft.ServiceModel.Channels.Mail.ExchangeWebService.dll

此外,桌面上还必须有标准桌面 WCF DLL。

请参见

任务

演练:使用 WCF Exchange Server 邮件传输

其他资源

Windows Communication Foundation (WCF) 开发与 .NET Compact Framework