好吧,经过更多的阅读,我发现了这个例外的原因。
https://developers.google.com/accounts/docs/OAuth2#expiration
https://developers.google.com/analytics/devguides/config/mgmt/v3/mgmtAuthorization?#helpme
授权无效:刷新令牌数量已经超过(默认为25)。 就是这样。
根据以下文档:每个Google用户帐户目前存在25令牌限制。如果用户帐户有25个有效令牌,则下一个验证请求会成功,但会悄悄地使最旧的未完成令牌无效,而不会显示任何用户可见的警告。
如果应用程序尝试使用无效刷新标记,则返回invalid_grant错误响应。每个唯一一对OAuth 2.0客户端和Google Analytics帐户的限额为25个刷新标记(请注意,此限制可能会有所更改)。
了解的是,它们将刷新标记的数量限制为25个,但当您需要超出此限制时,他们不会说出要执行的操作。呃......我一直在试验,并找到了解决方法如何绕过这个限制。似乎的确回收应用程序池解决了问题(当然直到下一个25-限制达到)。我们可以手动从IIS或通过运行以下命令回收程序池:
c:\Windows\System32\inetsrv\appcmd.exe recycle apppool /apppool.name:AppPoolName
您可以计划要执行的命令,每晚或每小时,无论...
但是我发现有一个纲领性的解决方案:
覆盖为控制器onException的方法(它是MVC应用程序)
protected override void OnException(ExceptionContext filterContext)
{
if (filterContext.ExceptionHandled) return;
// Log exception details
Global.LogException(filterContext.Exception, EventLogEntryType.Error);
if (filterContext.Exception.Message.Contains("invalid_grant"))
{
// Invalid Grant: The refresh token limit has been exceeded (default is 25).
// https://developers.google.com/accounts/docs/OAuth2#expiration
// https://developers.google.com/analytics/devguides/config/mgmt/v3/mgmtAuthorization?#helpme
Global.RecycleAppPool();
Global.LogException(new Exception("AppPool has been recycled"), EventLogEntryType.Information);
Response.Redirect("Index");
}
var actionName = filterContext.RouteData.Values["action"].ToString();
// Return friendly error message
var errorMessage = string.Format("Action {0} failed with error: {1}. Please try again.", actionName, filterContext.Exception.Message);
filterContext.Result = Content(errorMessage);
filterContext.ExceptionHandled = true;
base.OnException(filterContext);
}
凡RecycleAppPool是(这个操作是快速定义这个样子,不喜欢重新启动IIS :):
public static void RecycleAppPool()
{
ServerManager serverManager = new ServerManager();
ApplicationPool appPool = serverManager.ApplicationPools["Homepage"];
if (appPool != null)
{
if (appPool.State == ObjectState.Stopped) appPool.Start();
else appPool.Recycle();
}
}
所以,在invalid_grant异常的情况下,除了“吞噬”:登录,应用程序池被回收并为限刷新令牌被重置。希望这可以帮助。
请让你发现一些问题,我知道了。
这正是对我来说。我与NTP同步,然后重新启动IIS。 http://nefaria.com/2013/03/configure-windows-server-20082012-to-sync-with-internet-time-servers/ – pharophy