从绑定文件夹与 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 应用程序中。
问题
- 有谁知道为什么文件夹字符串以不同的方式呈现并且
如何解决这个问题?
- 如果没有可用的修复方法,我可能会找到并替换未知字符,但我不确定是什么
这是。字符显示为“?”在控制台中 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 才能获得整个值。
我正在使用 EWS 从 Microsoft Exchange 收件箱文件夹中检索文件夹路径。但是,当使用 FindFolderResult 检索文件夹路径与直接从文件夹检索路径时,我得到了不同的结果。请注意,在这两种情况下,返回的路径都是正确的,但在第二种情况下(直接从文件夹中检索)分隔文件夹名称的分隔符是一些未知字符。
我使用的是Visual Studio 2013,目标框架是4.5。我已经在控制台应用程序中演示了该问题,但它也存在于 WPF 应用程序中。
问题
- 有谁知道为什么文件夹字符串以不同的方式呈现并且 如何解决这个问题?
- 如果没有可用的修复方法,我可能会找到并替换未知字符,但我不确定是什么 这是。字符显示为“?”在控制台中 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 才能获得整个值。