You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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实际接收内容的差异导致的,咱们拆解来看:

  1. C#的字符串转义规则:
    在C#里,如果你想在一个用双引号包裹的字符串里,再包含一个双引号字符,必须用\"来转义——这个反斜杠是给C#编译器看的,告诉它:后面的双引号是字符串内容的一部分,不是当前字符串的结束标记。

  2. 打印结果的含义:
    你打印出来的字符串里的反斜杠,只是C#用来展示字符串的一种方式(相当于“调试视图”),目的是让你能清楚看到哪些双引号是被转义过的、属于字符串内容的一部分。这并不是实际发送给API的内容。

  3. API真正收到的内容:
    当你把这个字符串传给Microsoft Graph的QueryOption时,C#会自动处理掉转义符,实际发送给API的是去掉反斜杠后的版本:

    category <> "Person" AND category <> "Person 2"
    

    这完全符合Graph API的要求——字符串值用双引号包裹,不需要额外转义。

而你第一次的写法之所以失败,是因为没有正确转义内部的双引号:C#编译器会把"Person"里的第一个双引号当成整个filter字符串的结束标记,导致最终生成的字符串里,Person和Person 2都没有被双引号包裹,API自然无法识别这个过滤器语法。

内容的提问来源于stack exchange,提问作者user8608110

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:25:26