如何在C#GraphSDK中可靠地识别节流服务异常

如何在C#GraphSDK中可靠地识别节流服务异常,c#,microsoft-graph-api,C#,Microsoft Graph Api,我目前正在测试可靠地检测C#GraphSdk中节流的方法 发送过多联系请求(10.000req/10min)至: 我将收到以下ServiceException: 我的第一个想法是只检查StatusCode,但由于它来自类型,RESTAPI发送的“节流”代码429不包含在枚举中 目前,我使用此代码检测节流消息: if(e.StatusCode.ToString() == "429") { Console.WriteLine("this is an throttling exception

我目前正在测试可靠地检测C#GraphSdk中节流的方法

发送过多联系请求(10.000req/10min)至:

我将收到以下ServiceException:

我的第一个想法是只检查StatusCode,但由于它来自类型,RESTAPI发送的“节流”代码429不包含在枚举中

目前,我使用此代码检测节流消息:

if(e.StatusCode.ToString() == "429")
{
    Console.WriteLine("this is an throttling exception");
}
这种方法的缺点是,如果在将来的某个时间添加429的枚举,则此代码将失败。默默地。导致一个难以注意的错误

我不能使用
错误属性yobj
中的字符串属性
code
,因为它不能保证总是相同的消息,例如“请求太多”。 特别是在这种情况下,
ErrorCode
(字符串)被错误地设置为“未知错误”,而不是“请求过多”(可能是一个bug)

  • 有什么建议或想法可以让我可靠地注意到节流吗 错误
  • 特别是关于如何可靠地比较 HTTPStatusCode等于429
  • 也许有一些文档描述了检查错误代码的另一种方法

通过使用
int
而不是
字符串
值,您可以避免被
HttpStatusCode
枚举的任何更改击中。如您所述,如果为
429
添加枚举,则
字符串将发生更改,但
int
值将保持不变:

switch ((int) e.StatusCode)
{
    case 429:
        Console.WriteLine("this is an throttling exception");
        break;

    default:
}

另一种方法是查看响应头。当我们429您时,我们添加了一个Retry After response标头,您可以在上面的屏幕截图中看到它。

如果感兴趣,我使用了一个简单的for循环“var result=wait graphClient.Users[userId]。Contacts[contactId]。Request().GetAsync();”由同一租户下的多个客户端发送,以生成限制案例。请注意,对于来自Microsoft Graph的429个响应,重试后响应标头并不总是存在。
switch ((int) e.StatusCode)
{
    case 429:
        Console.WriteLine("this is an throttling exception");
        break;

    default:
}