首页 > 解决方案 > 订阅验证错误处理

问题描述

我目前正在尝试使用 Graph SDK 处理无法及时验证订阅请求的异常。不幸的是,我不确定如何实现这一目标。未及时验证订阅时引发的异常是:

Microsoft.Graph.ServiceException:代码:InvalidRequest 消息:订阅验证请求失败。必须以 200 OK 响应此请求。

ServiceException 中的HttpStatusCode是“BadRequest”,但这还不足以将错误与其他常见错误区分开来,因为我想以不同的方式处理它们。ServiceException 还包含一个带有名为“Code”的字符串属性的 Error 属性,在我的例子中它包含“InvalidRequest”。Graph SDK 中的GraphErrorCode枚举包含此代码,因此我将其与 ServiceException 中的“IsMatch”方法一起使用:

catch (ServiceException serviceException)
{
     var invRequest = GraphErrorCode.InvalidRequest.ToString();
     if(serviceException.StatusCode == HttpStatusCode.BadRequest)
     {
          if (serviceException.IsMatch(invRequest))
          {
              // do something
          }
      }
}

“InvalidRequest”在图形文档中定义为:

请求格式不正确或不正确。

考虑到这一点,我仍然认为我的 ErrorHandling 不足以捕获这个特定的错误。

我想知道的是:

标签: c#microsoft-graph-api

解决方案


您正在引用一个过时的库(超过 2 年)。正确的 SDK 是Microsoft Graph .NET Client Library。它包括一个更新的错误代码枚举

至于处理错误,代码通常足以处理异常。消息内容对于调试很有用,因为它通常包含更详细的信息(究竟是什么失败了,哪些属性无效等)。我的一般经验法则是使用code处理错误但同时记录codemessage属性以进行调试。

要理解的重要部分是不同的端点可能出于不同的原因显示相同的错误代码。A在针对资源BadRequest发出 a 时可能意味着与发出to时不同。您的处理程序应同时考虑操作错误GETuserPOST/events

以下是发送无效请求 ( /v1.0/me/a) 时返回的示例错误:

{
    "error": {
        "code": "BadRequest",
        "message": "Unsupported segment type. ODataQuery: users/48d31887-5fad-4d73-a9f5-3c356e68a038/a",
        "innerError": {
            "request-id": "fd4c8b27-26af-4b07-a5be-5efb139d1eb7",
            "date": "2018-05-22T14:39:02"
        }
    }
}

如果我处理的只是BadRequest,我的处理程序可能就足够了。我可以处理错误并让用户继续前进。但是,在我的日志中,我将两者都存储起来BadRequestUnsupported segment type. ODataQuery: users/48d31887-5fad-4d73-a9f5-3c356e68a038/a以便我可以正确地在代码中提交错误。

另一种选择可能是进行一些额外的解析。可以说这/a并不总是返回错误。也许/a对 AAD 帐户有效,但对 MSA 用户无效(FTR,/a完全是虚构的)。如果是这种情况,我可能还想解析message并查看是否包含“不支持的段类型”并处理它与不包含该消息BadRequest的 a 有点不同。BadRequest


推荐阅读