代码无效或已过期.使用API调用显式地使会话无效



有一个ASP.NET 4.0应用程序使用Facebook API。它一直正常工作到上周。当我尝试获取应用程序的访问令牌时

public static string GetWebResponse_HttpWebRequest(string url)
{
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
request.Method = "GET";
WebResponse webResponse;
string response = "";
webResponse = request.GetResponse();
io.Stream stream = webResponse.GetResponseStream();
io.StreamReader str = new io.StreamReader(stream);
response = str.ReadToEnd();
return response;
}
url: https://graph.facebook.com/oauth/access_token?client_id=117260348353246&client_secret=7b8734d7f36bf007d0d40bec728b57d9&code=AQD5xcdQiE2Ab9RpmexVUdP-i_2Nm5V52SVhxBVXkeq7WlJoOQ-xB4wYgbs3yeejLFHmR-lKLj0cwg6FeMWKGvHwT4akAlN7uMLxqu9YaqFumup3SPkuTjuQYETTCqQ1n2MAQjzexqiv8WV3UEcO4Qy5lObQ13qdYlKoYdKUacT42oJ0vhVuopH2WNkk3QRCq6DeAl02YU-sD8X8PTZgu52e&redirect_uri=http://www.opinere.com

出现错误:

{"error":{"message":"Code was invalid or expired. The session was invalidated explicitly using an API call.","type":"OAuthException","code":100}}

在我的本地机器上,应用程序工作正常。在Windows Azure上,有时它有效,但大多数情况下无效
怎么了?

更新:有两个请求:1) 没有错误2) 并且在一分钟内出现错误-Code2(访问令牌)为空区别似乎在于标题"HTTP_REFERER"。第二个请求不存在。

让我向您解释一下发生了什么。此问题与多个web角色有关。

azure中的web角色是什么

Web角色是VHD,即系统映像虚拟运行,并将您的数据/网站复制到其中。分配、初始化和复制是结构的工作。

网络角色如何协同工作

负载均衡器在角色之间均衡地平衡传入流量。这意味着在一个网络角色中创建的会话将在另一个角色中失效。不仅仅是会话,甚至表单身份验证都不起作用。

为什么

因为会话/表单身份验证使用machineKey来加密/哈希。每个web角色/虚拟机都有不同的machineKey。现在你明白了为什么它有时有效,有时无效。当请求到达创建会话的同一角色VM时,它会工作,如果没有,它就不会工作。一般来说,它只适用于创建的每个会话的1:no角色时间(大约)。

解决方案

这就像你在一个网络农场中托管你的网站一样。所以你应该看看如何让你的网站在网络农场中运行。或者,您可以只使用一个web角色,如果您使用两个小型虚拟机/角色,您可以仅使用一个大型虚拟机,但这完全取决于您的应用程序的行为,因此您应该首先测试什么最有效,多个虚拟机还是一个大虚拟机。此外,对于一个失去可靠性的虚拟机,如果你的角色失败,你的网站就会瘫痪。

在此处查找使用表存储的解决方案http://www.intertech.com/Blog/Post/Session-State-in-Windows-Azure.aspx

EDIT使用cookie而不是将令牌保存到会话中,但您并没有解决根本问题,如果您不解决核心问题,您将遇到许多问题。

最新更新