4

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”。在第二个请求中不存在。

4

1 回答 1

2

让我向你解释发生了什么。此问题与多个 Web 角色有关。

azure 中的 Web 角色是什么?

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

Web 角色如何协同工作?

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

为什么?

因为 session/forms 身份验证使用 machineKey 来加密/散列。每个 Web 角色/虚拟机都有不同的 machineKey。现在你明白为什么它有时有效,有时无效。当请求到达创建会话的同一角色 VM 时,它会起作用,否则不会。一般来说,它只适用于每个创建的会话(大约)的 1:no 角色时间。

解决方案?

就像您在网络农场中托管您的网站一样。所以你应该看看如何让你的网站在网络农场中运行。或者您可以只使用一个 Web 角色,如果您使用 2 个小型虚拟机/角色,则可以只使用一个大型虚拟机,但这一切都取决于您的应用程序的行为方式,因此您应该首先测试最有效的方式,多个虚拟机或一个大虚拟机。此外,如果使用单个 VM,您会失去可靠性,如果您的角色出现故障,您的网站也会出现故障。

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

编辑 不是将令牌保存到会话中,而是使用 cookie,但是您并没有解决根本问题,如果您不对核心问题采取任何措施,您将遇到很多问题。

于 2012-11-27T14:30:55.330 回答