C# 订阅验证错误处理

C# 订阅验证错误处理,c#,microsoft-graph-api,C#,Microsoft Graph Api,我目前正在尝试使用Graph SDK处理无法及时验证订阅请求的异常。不幸的是,我真的不知道如何实现这一点。未及时验证订阅时引发的异常为: Microsoft.Graph.ServiceException:代码:InvalidRequest 消息:订阅验证请求失败。必须回复200“确定” 这是我的请求 ServiceException中的错误是“BadRequest”,但这不足以将错误与其他常见错误区分开来,因为我希望以不同的方式处理它们。ServiceException还包含一个错误属性,该属性

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

Microsoft.Graph.ServiceException:代码:InvalidRequest 消息:订阅验证请求失败。必须回复200“确定” 这是我的请求

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

catch (ServiceException serviceException)
{
     var invRequest = GraphErrorCode.InvalidRequest.ToString();
     if(serviceException.StatusCode == HttpStatusCode.BadRequest)
     {
          if (serviceException.IsMatch(invRequest))
          {
              // do something
          }
      }
}
“InvalidRequest”的定义如下:

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

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

我想知道的是:

  • 使用“GraphErrorCode”枚举是否正确

  • 有没有一种方法可以处理此特定错误,而不必将异常消息(“订阅验证请求失败。必须对此请求使用200 OK进行响应”)与硬编码字符串进行比较


您正在引用一个过时的库(超过2年)。正确的SDK是。它包括一个远为近期的项目

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

需要理解的一点是,不同的端点可能出于不同的原因出现相同的错误代码。对
用户
资源发出
GET
时,与向
/events
发出
POST
时相比,
BadRequest
的含义可能有所不同。处理程序应该同时考虑操作和错误

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

如果我只处理了
BadRequest
,我的处理程序可能就足够了。我可以处理错误并让用户继续前进。然而,在我的日志中,我存储了
BadRequest
不支持的段类型。ODataQuery:users/48d31887-5fad-4d73-a9f5-3c356e68a038/a
这样我就可以在代码中正确地提交一个bug


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

我只是想澄清一下。error JSON representations code属性能否包含HttpErrorCodes(由于您在示例中使用了BadRequest,这在中没有提到。也是最后一点。解析消息是否不可靠,因为它可能会发生变化?谢谢您详细的回答。顺便说一句,我普遍认为解析消息不太理想。它们肯定会发生变化。为了帮助缓解这一点,我倾向于为keywo解析消息rds而不是完整的消息。它不是完美的,但更好一点。至于
BadRequest
,它实际上在该文档中(第一项,
400-Bad Request
)。JSON不携带HTTP代码,因为它已经在JSON负载附带的响应头中。
{
    "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"
        }
    }
}