【问题标题】:Searching Of Folders in Public Folders by giving its PATH Name通过给出其 PATH 名称搜索公共文件夹中的文件夹
【发布时间】:2013-01-28 11:33:38
【问题描述】:

是否可以通过使用 Exchange Web Service(EWS) Managed Api 提供文件夹的路径来搜索公用文件夹中的所有文件夹和子文件夹?

【问题讨论】:

    标签: c# web-services api exchange-server managed


    【解决方案1】:

    您只能在文件夹中搜索,在 EWS 上一层深,因此:

    PublicFoldersRoot\subjectA\sectionB\partC\

    我会搜索“subjectA”文件夹,然后一旦我有了那个 FolderId,然后我会搜索“sectionB”文件夹,依此类推,直到找到我需要的东西。

    GetPublicFolderByPath 方法采用路径“subjectA\sectonB\partC\”并将路径拆分为文件夹名称数组,然后递归查找每个文件夹。

    public Folder GetPublicFolderByPath(ExchangeService service, String ewsFolderPath)
    {
        String[] folders = ewsFolderPath.Split('\');
    
        Folder parentFolderId = null;
        Folder actualFolder = null;
    
        for (int i = 0; i < folders.Count(); i++)
        {
            if (0 == i)
            {
                parentFolderId = GetTopLevelFolder(service, folders[i]);// for first first loop public folder root is the parent
                actualFolder = parentFolderId; //in case folders[] is only one long
            }
            else
            {
                actualFolder = GetFolder(service, parentFolderId.Id, folders[i]);
                parentFolderId = actualFolder;
            }
        }
        return actualFolder;
    }
    

    GetTopLevelFolder 方法获取第一个文件夹“sectionA”,它是公用文件夹根目录的子文件夹,也就是“WellKnownFolderName.PublicFoldersRoot”。

    private Folder GetTopLevelFolder(ExchangeService service, String folderName)
        {
            FolderView folderView = new FolderView(int.MaxValue);
            FindFoldersResults findFolderResults = service.FindFolders(WellKnownFolderName.PublicFoldersRoot, folderView);
    
            foreach (Folder folder in findFolderResults)
            {
                if (folderName.Equals(folder.DisplayName, StringComparison.InvariantCultureIgnoreCase))
                {
                    return folder;
                }
            }
            throw new Exception("Top Level Folder not found: " + folderName);
        }
    

    GetFolder 方法采用父 FolderId 并在所有子文件夹中搜索名称提供的匹配项,并返回您请求的子 FolderId。

    private Folder GetFolder(ExchangeService service, FolderId ParentFolderId, String folderName)
        {
            FolderView folderView = new FolderView(int.MaxValue);
            FindFoldersResults findFolderResults = service.FindFolders(ParentFolderId, folderView);
    
            foreach (Folder folder in findFolderResults)
            {
                if (folderName.Equals(folder.DisplayName, StringComparison.InvariantCultureIgnoreCase))
                {
                    return folder;
                }
            }
    
            throw new Exception("Folder not found: " + folderName);
    
        }
    

    请注意,我使用的是 Microsoft.Exchange.WebServices 托管 API dll,与 https://yourexchangeserver/ews/services.wsdl 的想法类似。要从路径中获取文件夹,请创建 ExchangeService 对象,然后写入:
    GetPublicFolderByPath(service, "subjectA\sectionB\partC\")

    如果这对你有帮助,请投票 :)

    【讨论】:

      【解决方案2】:

      这是基于@ono2012 的回答的包装器

      using System;
      using System.DirectoryServices.AccountManagement;
      using System.Linq;
      using System.Net;
      using System.Net.Security;
      using System.Security.Cryptography.X509Certificates;
      using Microsoft.Exchange.WebServices.Data;
      
      namespace EmailServices.Web.IntegrationTests
      {
          // http://msdn.microsoft.com/en-us/library/exchange/jj220499(v=exchg.80).aspx
          internal class MsExchangeServices
          {
              public MsExchangeServices()
              {
                  ServicePointManager.ServerCertificateValidationCallback = CertificateValidationCallBack;
                  m_exchangeService = new ExchangeService { UseDefaultCredentials = true };
      
                  // Who's running this test? They better have Exchange mailbox access.
                  m_exchangeService.AutodiscoverUrl(UserPrincipal.Current.EmailAddress, RedirectionUrlValidationCallback);
              }
      
              public ExchangeService Service { get { return m_exchangeService; } }
      
              public Folder GetPublicFolderByPath(string ewsFolderPath)
              {
                  string[] folders = ewsFolderPath.Split('\\');
      
                  Folder parentFolderId = null;
                  Folder actualFolder = null;
      
                  for (int i = 0; i < folders.Length; i++)
                  {
                      if (0 == i)
                      {
                          parentFolderId = GetTopLevelFolder(folders[i]);
                          actualFolder = parentFolderId;
                      }
                      else
                      {
                          actualFolder = GetFolder(parentFolderId.Id, folders[i]);
                          parentFolderId = actualFolder;
                      }
                  }
                  return actualFolder;
              }
      
              private static bool RedirectionUrlValidationCallback(string redirectionUrl)
              {
                  // The default for the validation callback is to reject the URL.
                  bool result = false;
      
                  Uri redirectionUri = new Uri(redirectionUrl);
      
                  // Validate the contents of the redirection URL. In this simple validation
                  // callback, the redirection URL is considered valid if it is using HTTPS
                  // to encrypt the authentication credentials. 
                  if (redirectionUri.Scheme == "https")
                      result = true;
      
                  return result;
              }
      
              private static bool CertificateValidationCallBack(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
              {
                  // If the certificate is a valid, signed certificate, return true.
                  if (sslPolicyErrors == SslPolicyErrors.None)
                      return true;
      
                  // If there are errors in the certificate chain, look at each error to determine the cause.
                  if ((sslPolicyErrors & SslPolicyErrors.RemoteCertificateChainErrors) == 0)
                  {
                      // In all other cases, return false.
                      return false;
                  }
                  else
                  {
                      if (chain != null)
                      {
                          foreach (X509ChainStatus status in chain.ChainStatus)
                          {
                              if ((certificate.Subject == certificate.Issuer) && (status.Status == X509ChainStatusFlags.UntrustedRoot))
                              {
                                  // Self-signed certificates with an untrusted root are valid. 
                              }
                              else
                              {
                                  if (status.Status != X509ChainStatusFlags.NoError)
                                  {
                                      // If there are any other errors in the certificate chain, the certificate is invalid,
                                      // so the method returns false.
                                      return false;
                                  }
                              }
                          }
                      }
      
                      // When processing reaches this line, the only errors in the certificate chain are 
                      // untrusted root errors for self-signed certificates. These certificates are valid
                      // for default Exchange server installations, so return true.
                      return true;
                  }
              }
      
              private Folder GetTopLevelFolder(string folderName)
              {
                  FindFoldersResults findFolderResults = m_exchangeService.FindFolders(WellKnownFolderName.PublicFoldersRoot, new FolderView(int.MaxValue));
                  foreach (Folder folder in findFolderResults.Where(folder => folderName.Equals(folder.DisplayName, StringComparison.InvariantCultureIgnoreCase)))
                      return folder;
      
                  throw new Exception("Top Level Folder not found: " + folderName);
              }
      
              private Folder GetFolder(FolderId parentFolderId, string folderName)
              {
                  FindFoldersResults findFolderResults = m_exchangeService.FindFolders(parentFolderId, new FolderView(int.MaxValue));
                  foreach (Folder folder in findFolderResults.Where(folder => folderName.Equals(folder.DisplayName, StringComparison.InvariantCultureIgnoreCase)))
                      return folder;
      
                  throw new Exception("Folder not found: " + folderName);
              }
      
              readonly ExchangeService m_exchangeService;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-09-11
        • 2019-10-28
        • 1970-01-01
        • 1970-01-01
        • 2012-11-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多