【问题标题】:EWS Error Accessing Public Folders - Exchange 2010 With Replicated Exchange 2003 Public FoldersEWS 访问公用文件夹时出错 - 带有复制的 Exchange 2003 公用文件夹的 Exchange 2010
【发布时间】:2011-07-21 04:59:34
【问题描述】:

我们目前有以下设置:

单个 Exchange 2003 服务器 – 同时运行 Exchange 2010 公用文件夹数据库 单个 Exchange 2010 服务器 – 还运行 Exchange 2010 公用文件夹数据库和客户端访问角色(例如,使用 EWS、OWA 等)

我们在 2010 年保留了公用文件夹,在 2003 年保留了公用文件夹。我们正在服务器之间双向复制公用文件夹(通过公用文件夹管理控制台配置)。

我们有一个测试帐户,在 Exchange 2010 上有一个邮箱,该邮箱具有最高级别的权限(域管理员以及 Exchange 中的“组织管理”)。这个用户被称为“灰色”。已明确授予用户对 2010 公用文件夹数据库和 2003 公用文件夹数据库中所有公用文件夹的完全所有权。我们可以确认我们可以通过 OWA 和 Outlook 完全可以访问和使用公用文件夹。

我们遇到的问题是通过 Exchange 访问公用文件夹。我们可以确认访问邮箱本身内的普通文件夹没有问题并且工作正常。

当运行以下简单代码 sn-p 循环遍历公共文件夹时,我们遇到了错误:

    public static void PublicFolderTest()
    {
        // Connect to Exchange Web Services 
        ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2010);
        service.Url = new Uri("https://gblonxch11/EWS/Exchange.asmx");
        service.Credentials = new WebCredentials("grey@home.local", "Welcome1");
        System.Net.ServicePointManager.ServerCertificateValidationCallback = ((sender, certificate, chain, sslPolicyErrors) => true);

        FolderView folderView = new FolderView(int.MaxValue);

        FindFoldersResults findResults = service.FindFolders(WellKnownFolderName.PublicFoldersRoot, folderView);

        if (findResults.Folders.Count > 0)
        {
            Console.WriteLine("Looping Through Public Folders");
        }

    }

此代码 sn-p 因 FindFolders 调用而失败,并带有以下错误堆栈:

Microsoft.Exchange.WebServices.Data.ServiceResponseException was unhandled
Message=The mailbox that was requested doesn't support the specified RequestServerVersion.
Source=Microsoft.Exchange.WebServices
StackTrace:
       at Microsoft.Exchange.WebServices.Data.ServiceRequestBase.ProcessWebException(WebException webException)
       at Microsoft.Exchange.WebServices.Data.ServiceRequestBase.InternalExecute()
       at Microsoft.Exchange.WebServices.Data.MultiResponseServiceRequest`1.Execute()
       at Microsoft.Exchange.WebServices.Data.ExchangeService.InternalFindFolders(IEnumerable`1 parentFolderIds, SearchFilter searchFilter, FolderView view, ServiceErrorHandling errorHandlingMode)
       at Microsoft.Exchange.WebServices.Data.ExchangeService.FindFolders(FolderId parentFolderId, FolderView view)
       at Microsoft.Exchange.WebServices.Data.ExchangeService.FindFolders(WellKnownFolderName parentFolderName, FolderView view)
       at testspace.Program.PublicFolderTest() in F:\Source Code\TestApp\TestApp\Program.cs:line 40
       at testspace.Program.Main(String[] args) in F:\Source Code\TestApp\TestApp\Program.cs:line 26
       at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
       at System.AppDomain.nExecuteAssembly(RuntimeAssembly assembly, String[] args)
       at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()
  InnerException: 

我们还在 IIS 中为 EWS 应用程序打开了“失败的请求跟踪”。内部堆栈跟踪作为文件“UsingExchangeVersion2010.zip”附加。错误堆栈尚无定论——但堆栈内部存在与身份验证问题相关的错误。

我们还尝试将 EWS 托管 API 使用的 ExchangeVersion 设置为 Exchange2007_SP1:

    public static void PublicFolderTest()
    {
        // Connect to Exchange Web Services 
        ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2007_SP1);
        service.Url = new Uri("https://gblonxch11/EWS/Exchange.asmx");
        service.Credentials = new WebCredentials("grey@home.local", "Welcome1");
        System.Net.ServicePointManager.ServerCertificateValidationCallback = ((sender, certificate, chain, sslPolicyErrors) => true);

        FolderView folderView = new FolderView(int.MaxValue);

        FindFoldersResults findResults = service.FindFolders(WellKnownFolderName.PublicFoldersRoot, folderView);

        if (findResults.Folders.Count > 0)
        {
            Console.WriteLine("Looping Through Public Folders");
        }

    }

这会导致错误,但错误略有不同:

Microsoft.Exchange.WebServices.Data.ServiceResponseException was unhandled
Message=An internal server error occurred. The operation failed.
Source=Microsoft.Exchange.WebServices
StackTrace:
       at Microsoft.Exchange.WebServices.Data.ServiceRequestBase.ProcessWebException(WebException webException)
       at Microsoft.Exchange.WebServices.Data.ServiceRequestBase.InternalExecute()
       at Microsoft.Exchange.WebServices.Data.MultiResponseServiceRequest`1.Execute()
       at Microsoft.Exchange.WebServices.Data.ExchangeService.InternalFindFolders(IEnumerable`1 parentFolderIds, SearchFilter searchFilter, FolderView view, ServiceErrorHandling errorHandlingMode)
       at Microsoft.Exchange.WebServices.Data.ExchangeService.FindFolders(FolderId parentFolderId, FolderView view)
       at Microsoft.Exchange.WebServices.Data.ExchangeService.FindFolders(WellKnownFolderName parentFolderName, FolderView view)
       at testspace.Program.PublicFolderTest() in F:\Source Code\TestApp\TestApp\Program.cs:line 40
       at testspace.Program.Main(String[] args) in F:\Source Code\TestApp\TestApp\Program.cs:line 26
       at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
       at System.AppDomain.nExecuteAssembly(RuntimeAssembly assembly, String[] args)
       at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()
  InnerException: 

IIS 内部的 EWS 堆栈跟踪作为文件“UsingExchangeVersion2007.zip”附加。内部堆栈跟踪再次不确定——但似乎与身份验证问题有关。

谁能告诉我们以前是否见过这种情况,也许根本原因是什么?

【问题讨论】:

    标签: exchange-server exchangewebservices


    【解决方案1】:

    我可以在这里看到几个问题:

    1. 首先,您不能在 Exchange 2007 和 2010 中拥有超级用户帐户来访问邮箱。如果用户是任何 Exchange 管理组的成员,他将被明确拒绝通过 EWS API 访问邮箱。不过,他可以是域管理员或本地管理员。因此,请检查您在 EWS 中使用的帐户是否存在。

    2. 在像您这样的混合环境中 - 2003 和(2007 或 2010)在 2010 上具有 CAS 服务器并不意味着您可以从 EWS 访问 2003 邮箱。唯一的方法是将邮箱从 2003 存储迁移到 2007 存储。这可能是您得到第一个异常以及第二个异常的原因。

    3. 我不太确定公用文件夹在 Exchange 内部是如何工作的,从未使用过它们,但我可以建议这只是一种特殊的邮箱。在这种情况下,您的用户必须具有模拟权限。从 Exchange 控制台授予完全访问权限并无济于事 - 仅在 2007 年就足够了。以下是如何在 2010 年启用模拟的链接:http://msdn.microsoft.com/en-us/library/bb204095.aspx

    欢迎来到 Exchange 世界。

    【讨论】:

    • 您好 Aloneguid,感谢您的回复和一些有趣的信息。但这里的问题不是访问邮箱。服务帐户在访问其他人的邮箱时有效(就像您说的假设邮箱在 2010 年)。这都是笨拙的多莉。这里的问题是访问公用文件夹。使用 EWS 失败。无论公用文件夹是否存储在 Exchange 2003 框中并复制到 2010 或反之亦然,它都会失败。他们都失败了。
    • 我们还在 2010 年尝试过公用文件夹(例如,从 2003 年删除公用文件夹),但我们仍然遇到这些错误。很奇怪。票证是通过 MS 支持提出的。但是,如果有人有修复方法,那就太好了。
    【解决方案2】:

    ExchangeService 服务 = 新 ExchangeService(ExchangeVersion.Exchange2010)

    试试这个

    ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2007_SP1)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-08-10
      • 1970-01-01
      • 2013-06-11
      • 2014-03-21
      • 1970-01-01
      • 1970-01-01
      • 2016-10-14
      相关资源
      最近更新 更多