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

本文关键字:文件夹 路径 分隔符 EWS 绑定 FindFolderResults 返回 | 更新日期: 2023-09-27 18:15:27

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

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

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

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

<

代码片段/strong>

    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();
    }

输出示例

文件夹结果输出:'Inbox'Personal

绑定文件夹的输出:?Inbox?个人

文件夹结果输出:'Inbox'Personal'Contacts

从绑定文件夹输出:?Inbox?Personal?联系人

            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();
    }

其他有帮助的文章

c#将字符串转换为十六进制字符串

如何将十六进制字符串转换为字节数组?

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

返回的是字节顺序标记在字符串中有很多替换它们的方法

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

但是还有其他方法可以更简洁更快捷

在FindFolder中使用该属性时要小心的是,如果值的大小大于256字节,它将被截断,您将需要执行Bind/GetFolder来获取整个值