从绑定文件夹与 FindFolderResults 返回时,EWS 文件夹路径具有不同的分隔符

EWS folder path has different delimiter when returned from bound folder vs FindFolderResults

我正在使用 EWS 从 Microsoft Exchange 收件箱文件夹中检索文件夹路径。但是,当使用 FindFolderResult 检索文件夹路径与直接从文件夹检索路径时,我得到了不同的结果。请注意,在这两种情况下,返回的路径都是正确的,但在第二种情况下(直接从文件夹中检索)分隔文件夹名称的分隔符是一些未知字符。

我使用的是Visual Studio 2013,目标框架是4.5。我已经在控制台应用程序中演示了该问题,但它也存在于 WPF 应用程序中。

问题

  1. 有谁知道为什么文件夹字符串以不同的方式呈现并且 如何解决这个问题?
  2. 如果没有可用的修复方法,我可能会找到并替换未知字符,但我不确定是什么 这是。字符显示为“?”在控制台中 window 但是 在调试中不存在悬停(即名称之间没有分隔符)并显示为“[?]”(带有 里面有问号)当使用 debug.print 立即打印时。有什么想法吗?

请参阅下面的代码片段和输出示例。

代码段

    static void Main(string[] args)
    {
        string EmailAccount = "someemail@somedomain.com";

        ExchangeService myService = new ExchangeService(ExchangeVersion.Exchange2010_SP2);
        ServicePointManager.ServerCertificateValidationCallback = 
           CertificateValidationCallBack;
        myService.UseDefaultCredentials = true;
        myService.AutodiscoverUrl(EmailAccount, RedirectionUrlValidationCallback);

        ExtendedPropertyDefinition PR_Folder_Path = new 
          ExtendedPropertyDefinition(26293, MapiPropertyType.String);
        PropertySet myPropertySet = new PropertySet(BasePropertySet.IdOnly,  
           FolderSchema.DisplayName, PR_Folder_Path);

        FolderView myFolderView = new FolderView(100);
        myFolderView.PropertySet = myPropertySet;
        myFolderView.Traversal = FolderTraversal.Deep;

        FolderId targetFolder = WellKnownFolderName.Inbox;

        FindFoldersResults myFolderResults = 
           myService.FindFolders(targetFolder, myFolderView);

        foreach (var f in myFolderResults)
        {
            //Shows path text when retreived from FindFolderResults.  
            string s;
            f.TryGetProperty(PR_Folder_Path, out s);
            Console.WriteLine("Output from Folder Results:  {0}", s);

            //Binds the folder and show path text when retrieve from
            //directly from the bound folder. 
            string t;
            Folder myTestFolder = Folder.Bind(myService, f.Id, myPropertySet);
            myTestFolder.TryGetProperty(PR_Folder_Path, out t);
            Console.WriteLine("Output from Bound Folder  :  {0}", t);

        }

        Console.ReadLine();
    }

输出样本

Output from Folder Results: \Inbox\Personal

Output from Bound Folder : ?Inbox?Personal

Output from Folder Results: \Inbox\Personal\Contacts

Output from Bound Folder : ?Inbox?Personal?Contacts

是什么解决了我的问题

            string t;
            string c;
            Folder myTestFolder = Folder.Bind(myService, f.Id, myPropertySet);
            myTestFolder.TryGetProperty(PR_Folder_Path, out t);

            byte[] tBytes = Encoding.Default.GetBytes(t);
            var hexString = BitConverter.ToString(tBytes);
            hexString = hexString.Replace("3F", "5C");
            c = System.Text.Encoding.Default.GetString(StringToByteArray(hexString));

    public static byte[] StringToByteArray(string hex)
    {
        hex = hex.Replace("-", "");
        return Enumerable.Range(0, hex.Length)
                         .Where(x => x % 2 == 0)
                         .Select(x => Convert.ToByte(hex.Substring(x, 2), 16))
                         .ToArray();
    }

其他有帮助的帖子

Convert string to hex-string in C#

How can I convert a hex string to a byte array?

返回的是字节顺序标记,有多种方法可以在我使用的字符串中替换它们

Encoding.Unicode.GetString(HexConvertor.HexStringToByteArray(BitConverter.ToString(UnicodeEncoding.Unicode.GetBytes((String)FolderPathValue)).Replace("FE-FF", "5C-00")

但还有其他方法可能更干净、更快

在 FindFolder 中使用 属性 时要注意的是,如果值的大小大于 256 字节,它将被截断,您需要执行 Bind/GetFolder 才能获得整个值。