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

Asp.net 代码无效或已过期。使用API调用显式使会话无效,asp.net,facebook-graph-api,azure,Asp.net,Facebook Graph Api,Azure,有ASP.NET 4.0应用程序使用FacebookAPI。它一直正常工作到上周。 当我尝试获取应用程序的访问令牌时 public static string GetWebResponse_HttpWebRequest(string url) { HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest; request.Method = "GET"; WebResponse

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

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}}
在我的本地机器上,应用程序正常工作。 在
windowsazure
上,它有时能工作,但大部分不能。
怎么了

更新:有两个请求: 1) 2) 一分钟后,代码2(访问令牌)为空
看起来区别在于标题“HTTP_REFERER”。第二个请求不在。

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

azure中的web角色是什么?

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

网络角色如何协同工作?

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

为什么?

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

解决方案?

这就好像你在一个web服务器场中托管你的站点一样。因此,您应该了解如何使您的网站在web场中运行。或者您可以只使用一个web角色,如果您使用的是两个小型vm/角色,那么您可以只使用一个大型vm,但这一切都取决于您的应用程序的行为,因此您应该首先测试哪个工作得最好,多个vm还是一个大型vm。而且,如果你失去了一个虚拟机的可靠性,那么如果你的角色不在了,你的网站就会关闭

在这里寻找使用表存储的解决方案

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

当您说它有效,但大多数情况下无效时-您能解释一下您的意思吗。什么不起作用;例如,您收到了什么错误?您说“它在上周之前一直正常工作。”-有什么更改吗?“您收到了什么错误?”我收到错误“远程服务器返回了一个错误:(400)错误请求。”但当我查看HttpResponse文本时,上面有错误。很难理解错误的逻辑,但有时我会毫无问题地收到访问令牌。“有什么变化吗?”我修复了一个由实现页面映射引起的错误。但我不知道这些事件是如何联系在一起的。早些时候,当我转到以前的主机提供商时,我也遇到了类似的错误。通过向web.config添加永久密钥解决了问题:然后您可以在web.config中显式添加机器密钥,远程连接到角色实例,并从system drive中的machine.config复制machinekey行,或者使用您自己的,我尝试使用machinekey,但没有此部分,我自己的密钥-结果相同。但我会看看这个文件。访问令牌存储在cookie中。