为何Microsoft Graph API调用需在C#字符串中使用三重转义?
关于Microsoft Graph $search过滤器字符串转义的问题解答
咱们先把问题场景理清楚:
你最初定义的过滤器字符串是这样的:
string filter = "\"category <> \"Person\" AND category <> \"Person 2\"";
打印出来后得到:
filter = "category <> "Person" AND category <> "Person 2""
这个过滤器根本没法正常工作;而改用三重转义的写法后:
string filter = "\"category <> \\\"Person\\\" AND category <> \\\"Person2\\\""; List<QueryOption> options = new List<QueryOption> { new QueryOption("$search", filter) }; var messages = graphClient.Me .MailFolders .Inbox .Messages .Request(options) .Select("id, Categories, Subject") .Top(500) .GetAsync() .Result;
打印结果变成:
filter = "category <> \"Person\" AND category <> \"Person 2\""
这次API调用就正常了。你疑惑的点在于:明明Microsoft Graph的转义字符是双引号,为什么打印的字符串里却有反斜杠?
这其实是C#字符串转义和API实际接收内容的差异导致的,咱们拆解来看:
C#的字符串转义规则:
在C#里,如果你想在一个用双引号包裹的字符串里,再包含一个双引号字符,必须用\"来转义——这个反斜杠是给C#编译器看的,告诉它:后面的双引号是字符串内容的一部分,不是当前字符串的结束标记。打印结果的含义:
你打印出来的字符串里的反斜杠,只是C#用来展示字符串的一种方式(相当于“调试视图”),目的是让你能清楚看到哪些双引号是被转义过的、属于字符串内容的一部分。这并不是实际发送给API的内容。API真正收到的内容:
当你把这个字符串传给Microsoft Graph的QueryOption时,C#会自动处理掉转义符,实际发送给API的是去掉反斜杠后的版本:category <> "Person" AND category <> "Person 2"这完全符合Graph API的要求——字符串值用双引号包裹,不需要额外转义。
而你第一次的写法之所以失败,是因为没有正确转义内部的双引号:C#编译器会把"Person"里的第一个双引号当成整个filter字符串的结束标记,导致最终生成的字符串里,Person和Person 2都没有被双引号包裹,API自然无法识别这个过滤器语法。
内容的提问来源于stack exchange,提问作者user8608110
相关产品推荐
相关产品推荐

