使用自动发现查找连接点

了解如何使用自动发现服务将客户端应用程序定向到正确的 Exchange 服务器。

Exchange 自动发现服务为客户端应用程序提供电子邮件帐户的配置设置,这些帐户托管在Exchange Online、Exchange Online作为Office 365的一部分,或从 Exchange 2013 开始运行 Exchange 版本的 Exchange 服务器。 自动发现服务是提供配置设置的 Web 服务。 自动发现服务是一项 Web 服务,它向客户端应用程序提供 Exchange 服务器配置信息。 客户端应用程序使用自动发现来确定特定邮箱的自动发现服务的终结点。 本文介绍如何遵循来自 Exchange 服务器的响应来查找正确的终结点。

有关如何获取电子邮件地址配置设置的信息,请参阅 使用自动发现从 Exchange 获取用户设置从 Exchange 服务器获取域设置

注意

查找正确终结点的过程是用户或域设置请求的一部分。 自动发现服务使用一系列重定向响应将客户端应用程序发送到电子邮件地址的正确终结点。

可以使用以下 Exchange 开发技术之一访问自动发现服务:

  • Exchange Web Services (EWS) 托管 API

  • EWS

如果使用 EWS,可以使用以下方法来检索用户设置:

  • 基于 SOAP 的自动发现服务

  • XML (POX) 自动发现服务

  • 从 SOAP 或 XML 自动发现服务生成的自动生成的代理

有关这些方法的详细信息,请参阅 Exchange 的自动发现

有关这些 Exchange 开发技术的详细信息,请参阅 探索 Exchange 中的 EWS 托管 API、EWS 和 Web 服务

EWS 托管 API 提供基于对象的接口来检索用户设置。 如果客户端应用程序使用托管代码,建议使用 EWS 托管 API。 与典型的自动生成的 Web 服务代理相比,EWS 托管 API 接口针对简单对象模型进行了更好的优化。

如果使用 EWS,建议使用 SOAP 自动发现服务,因为它支持比 POX 自动发现服务更丰富的功能集。

查找终结点的先决条件

在创建使用自动发现服务的客户端应用程序之前,需要有权访问以下内容:

注意

如果使用 EWS 托管 API,则必须在某些情况下提供证书验证回调。 可能还需要包含某些生成的代理库的证书验证回调,例如 Visual Studio 创建的代理库。 有关详细信息,请参阅 验证 EWS 托管 API 的服务器证书

查找终结点的核心概念

在使用自动发现查找终结点之前,应熟悉下表中列出的概念。

概念 说明
Exchange 自动发现
概述自动发现服务的工作原理。

如果使用 EWS 托管 API,请使用 Microsoft.Exchange.WebServices.Data 命名空间中的 Microsoft.Exchange.WebServices.Data.ExchangeService 类来管理与 EWS 的连接。 若要使用本文中的 EWS 托管 API 代码示例,需要在代码中引用以下命名空间:

  • System.Net

  • Microsoft.Exchange.WebServices.Data.ExchangeService

使用 EWS 托管 API 查找正确的终结点

如果使用 EWS 托管 API,则对自动发现服务的调用由 ExchangeService 类处理。 若要确定电子邮件帐户的正确终结点,请对 [ExchangeService] 对象调用 AutodiscoverUrl 方法。 下面的代码示例演示如何使用 EWS 托管 API 将电子邮件地址的 EWS Web 服务终结点设置为正确的客户端访问服务器上的 Exchange.asmx 文件。

NetworkCredential credentials = new NetworkCredential(securelyStoredEmail, securelyStoredPassword);
ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2013);
service.Credentials = credentials;
service.AutodiscoverUrl("User1@contoso.com");

使用 EWS 查找正确的终结点

SOAP 自动发现服务可以使用一系列请求和响应将应用程序定向到 EWS 的正确终结点。 有关确定电子邮件帐户正确终结点的过程的信息,请参阅 Exchange 的自动发现。 以下 XML 示例显示了发出 SOAP 自动发现请求以查找正确终结点时可以期待的一系列请求和响应。

SOAP 自动发现终结点请求

以下示例演示一个 XML 请求,该请求发送到自动发现服务以查找正确的终结点。

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:a="https://schemas.microsoft.com/exchange/2010/Autodiscover" 
        xmlns:wsa="http://www.w3.org/2005/08/addressing" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xmlns:soap="https://schemas.xmlsoap.org/soap/envelope/">
  <soap:Header>
    <a:RequestedServerVersion>Exchange2013</a:RequestedServerVersion>
    <wsa:Action>https://schemas.microsoft.com/exchange/2010/Autodiscover/Autodiscover/GetUserSettings</wsa:Action>
    <wsa:To>https://mail.microsoft.com/autodiscover/autodiscover.svc</wsa:To>
  </soap:Header>
  <soap:Body>
    <a:GetUserSettingsRequestMessage xmlns:a="https://schemas.microsoft.com/exchange/2010/Autodiscover">
      <a:Request>
        <a:Users>
          <a:User>
            <a:Mailbox>User1@Contoso.com</a:Mailbox>
          </a:User>
        </a:Users>
        <a:RequestedSettings>
          <a:Setting>InternalEwsUrl</a:Setting>
          <a:Setting>ExternalEwsUrl</a:Setting>
        </a:RequestedSettings>
      </a:Request>
    </a:GetUserSettingsRequestMessage>
  </soap:Body>
</soap:Envelope>

SOAP 自动发现重定向响应

自动发现服务可以使用以下两种重定向响应之一进行响应:HTTP 302 重定向或 SOAP 重定向响应。 如果来自 Exchange 服务器的响应是 HTTP 302 重定向,则客户端应用程序应验证重定向地址是否可接受,然后遵循重定向响应。

重要

有关验证重定向响应的条件,请参阅 Exchange 的自动发现

如果自动发现服务返回重定向响应(由 UserResponse 元素的 ErrorCode 元素指示),则客户端应用程序应使用 RedirectTarget 元素构造发送到重定向响应中指定的服务器的新设置请求。 以下示例显示了来自服务器的重定向响应。

<s:Envelope xmlns:s="https://schemas.xmlsoap.org/soap/envelope/" xmlns:a="http://www.w3.org/2005/08/addressing">
  <s:Header>
    <a:Action s:mustUnderstand="1">https://schemas.microsoft.com/exchange/2010/
        Autodiscover/Autodiscover/GetUserSettingsResponse</a:Action>
    <h:ServerVersionInfo xmlns:h="https://schemas.microsoft.com/exchange/2010/Autodiscover" 
        xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
      <h:MajorVersion>15</h:MajorVersion>
      <h:MinorVersion>0</h:MinorVersion>
      <h:MajorBuildNumber>682</h:MajorBuildNumber>
      <h:MinorBuildNumber>1</h:MinorBuildNumber>
      <h:Version>Exchange2013</h:Version>
    </h:ServerVersionInfo>
  </s:Header>
  <s:Body>
    <GetUserSettingsResponseMessage xmlns="https://schemas.microsoft.com/exchange/2010/Autodiscover">
      <Response xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
        <ErrorCode>NoError</ErrorCode>
        <ErrorMessage />
        <UserResponses>
          <UserResponse>
            <ErrorCode>RedirectAddress</ErrorCode>
            <ErrorMessage>Redirection address.</ErrorMessage>
            <RedirectTarget>User1@mail.Contoso.com</RedirectTarget>
            <UserSettingErrors />
            <UserSettings />
          </UserResponse>
        </UserResponses>
      </Response>
    </GetUserSettingsResponseMessage>
  </s:Body>
</s:Envelope>

重定向后,客户端使用重定向 URL 准备另一个请求。 以下代码显示了从重定向响应创建的请求的示例。

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:a="https://schemas.microsoft.com/exchange/2010/Autodiscover" 
        xmlns:wsa="http://www.w3.org/2005/08/addressing" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xmlns:soap="https://schemas.xmlsoap.org/soap/envelope/">
  <soap:Header>
    <a:RequestedServerVersion>Exchange2013</a:RequestedServerVersion>
    <wsa:Action>https://schemas.microsoft.com/exchange/2010/
        Autodiscover/Autodiscover/GetUserSettings</wsa:Action>
    <wsa:To>https://autodiscover.exchange.microsoft.com/autodiscover/autodiscover.svc</wsa:To>
  </soap:Header>
  <soap:Body>
    <a:GetUserSettingsRequestMessage xmlns:a="https://schemas.microsoft.com/exchange/2010/Autodiscover">
      <a:Request>
        <a:Users>
          <a:User>
            <a:Mailbox>User1@mail.Contoso.com</a:Mailbox>
          </a:User>
        </a:Users>
        <a:RequestedSettings>
          <a:Setting>InternalEwsUrl</a:Setting>
          <a:Setting>ExternalEwsUrl</a:Setting>
        </a:RequestedSettings>
      </a:Request>
    </a:GetUserSettingsRequestMessage>
  </soap:Body>
</soap:Envelope>

当客户端应用程序已定向到自动发现服务的正确终结点时,服务器将发送响应,并将 UserResponse 元素的 ErrorCode 元素设置为 NoError,并包含请求的用户设置。 仅返回请求的用户设置 InternalEwsUrlExternalEwsUrl。 以下示例显示了来自服务器的响应。

<s:Envelope xmlns:s="https://schemas.xmlsoap.org/soap/envelope/" 
        xmlns:a="http://www.w3.org/2005/08/addressing">
  <s:Header>
    <a:Action s:mustUnderstand="1">https://schemas.microsoft.com/exchange/2010/
        Autodiscover/Autodiscover/GetUserSettingsResponse</a:Action>
    <h:ServerVersionInfo xmlns:h="https://schemas.microsoft.com/exchange/2010/Autodiscover" 
        xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
      <h:MajorVersion>15</h:MajorVersion>
      <h:MinorVersion>0</h:MinorVersion>
      <h:MajorBuildNumber>160</h:MajorBuildNumber>
      <h:MinorBuildNumber>4</h:MinorBuildNumber>
      <h:Version>Exchange2013</h:Version>
    </h:ServerVersionInfo>
  </s:Header>
  <s:Body>
    <GetUserSettingsResponseMessage xmlns="https://schemas.microsoft.com/exchange/2010/Autodiscover">
      <Response xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
        <ErrorCode>NoError</ErrorCode>
        <ErrorMessage />
        <UserResponses>
          <UserResponse>
            <ErrorCode>NoError</ErrorCode>
            <ErrorMessage>No error.</ErrorMessage>
            <RedirectTarget i:nil="true" />
            <UserSettingErrors />
            <UserSettings>
              <UserSetting i:type="StringSetting">
                <Name>InternalEwsUrl</Name>
                <Value>https://server.Contoso.com/ews/exchange.asmx</Value>
              </UserSetting>
              <UserSetting i:type="StringSetting">
                <Name>ExternalEwsUrl</Name>
                <Value>https://server.Contoso.com/ews/exchange.asmx</Value>
              </UserSetting>
            </UserSettings>
          </UserResponse>
        </UserResponses>
      </Response>
    </GetUserSettingsResponseMessage>
  </s:Body>
</s:Envelope>

后续步骤

按照自动发现过程查找终结点将返回请求的域或用户设置。 有关对特定设置发出请求的信息,请参阅以下文章:

另请参阅