通过提供其PATH名称来搜索公用文件夹中的文件夹

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

您只能在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”,它是公用文件夹root的子项,也就是“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类似。 要从路径获取文件夹,请使用createService对象然后编写:
GetPublicFolderByPath(service, "subjectA\sectionB\partC\")

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

这是基于@ 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; } }