c# - 订阅验证错误处理
问题描述
我目前正在尝试使用 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 不足以捕获这个特定的错误。
我想知道的是:
使用“GraphErrorCode”枚举甚至是正确的。
有没有办法处理这个特定的错误,而不仅仅是将异常消息(“订阅验证请求失败。必须以 200 OK 对此请求作出响应”)与硬编码字符串进行比较。
解决方案
您正在引用一个过时的库(超过 2 年)。正确的 SDK 是Microsoft Graph .NET Client Library。它包括一个更新的错误代码枚举。
至于处理错误,代码通常足以处理异常。消息内容对于调试很有用,因为它通常包含更详细的信息(究竟是什么失败了,哪些属性无效等)。我的一般经验法则是使用code
处理错误但同时记录code
和message
属性以进行调试。
要理解的重要部分是不同的端点可能出于不同的原因显示相同的错误代码。A在针对资源BadRequest
发出 a 时可能意味着与发出to时不同。您的处理程序应同时考虑操作和错误。GET
user
POST
/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
,我的处理程序可能就足够了。我可以处理错误并让用户继续前进。但是,在我的日志中,我将两者都存储起来BadRequest
,Unsupported segment type. ODataQuery: users/48d31887-5fad-4d73-a9f5-3c356e68a038/a
以便我可以正确地在代码中提交错误。
另一种选择可能是进行一些额外的解析。可以说这/a
并不总是返回错误。也许/a
对 AAD 帐户有效,但对 MSA 用户无效(FTR,/a
完全是虚构的)。如果是这种情况,我可能还想解析message
并查看是否包含“不支持的段类型”并处理它与不包含该消息BadRequest
的 a 有点不同。BadRequest
推荐阅读
- xcode - 创建表时 iOS 中的 Firebase/Messaging 出错
- python - 如何设置django项目可以从多个url进入admin管理登录页面
- jquery - 使用 php 将 iframe(谷歌地图)添加到 jquery
- angular - 'HttpErrorResponse' 类型的参数不可分配给类型参数
- python - 如何过滤 pyspark 数据框中的日期
- r - 在 R 数据框中创建一个新类
- python - 如何获取存储在列表中的实例的值
- docker - 一起使用 Nginx 和 Ocelot Api
- python - Django 向外部数据库模型添加新字段
- cypress - 如何使用 cypress 捕获和显示文本以自动出现和消失弹出窗口