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

时间:2012-11-27 11:05:02

标签: asp.net facebook-graph-api azure

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)without error 2)并在一分钟内with error - Code2(访问令牌)为空 似乎区别在于标题“HTTP_REFERER”。第二个请求缺席。

1 个答案:

答案 0 :(得分:2)

让我向你解释发生了什么。此问题适用于多个Web角色。

azure中的网络角色是什么?

Web角色是VHD,即系统映像几乎在您的数据/网站复制时运行。它是织物分配,初始化和复制的工作。

网络角色如何协同工作?

负载均衡器平衡角色之间的传入流量。这意味着在一个Web角色中创建的会话将在另一个Web角色中失效。它不仅仅是Sessions,即使是表单身份验证也不会起作用。

<强>为什么吗

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

<强>解决方案吗

就像您在网络服务器场中托管您的网站一样。因此,您应该了解如何使您的网站在Web场中运行。或者你可以只使用一个Web角色,如果你使用2个小vm /角色,你可以只使用一个大型虚拟机,但都取决于你的应用程序的行为方式,所以你应该首先测试什么效果最好,多个虚拟机或者一个大VM。此外,如果您的角色出现故障,使用单个虚拟机会降低可靠性,您的网站将会停用。

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

修改 不是将令牌保存到会话中,而是使用cookie,但是你没有解决根本问题,如果你没有对核心问题做些什么,你会遇到很多问题。