【问题标题】:ASP.net Adobe Air communication, session controlASP.net Adob​​e Air 通讯、会话控制
【发布时间】:2013-09-16 09:04:54
【问题描述】:

项目:Android 版 Adob​​e Air 连接到 ASP.net。这是 AS3 代码:

//First login to the server and also grabbing from there ASP_NET_SessionId data (Cookie).
var session:String;

var loader:URLLoader = new URLLoader();
loader.dataFormat = URLLoaderDataFormat.TEXT;

var request:URLRequest= new URLRequest("https://somedomain.com/someaddress.aspx"); //yes with https
request.data = '{ "Message":"Login", "Data": { "User":"some@email.com", "Password":"somepassword" }}';
request.method = URLRequestMethod.POST;   

loader.addEventListener( HTTPStatusEvent.HTTP_RESPONSE_STATUS, httpStatusHandler);   
loader.addEventListener(Event.COMPLETE, completeHandler);
loader.load(request);

private function httpStatusHandler(e:HTTPStatusEvent):void 
{
    for each (var object:Object in e.responseHeaders)
    {
           if (object.name == "Set-Cookie")
           {
              var match:Array =object.value.match(/ASP.NET_SessionId=(.*?);/i);
              session = match[1];
              return
           }
    }
}

下一个调用是我已经获得的会话数据(Cookie):

var loader:URLLoader = new URLLoader();
loader.dataFormat = URLLoaderDataFormat.BINARY; //now I just need binary data

var request:URLRequest= new URLRequest("https://somedomain.com/someaddress.aspx"); //yes with https
request.data = '{ "Message":"DoSomeStaff", "Data": { "Some":"info"}}';   
request.method = URLRequestMethod.POST;
request.requestHeaders = new Array(new URLRequestHeader("Cookie", "ASP.NET_SessionId=" + session )); //addedd Cookie data here

loader.addEventListener(Event.COMPLETE, completeHandler);
loader.load(request);

我在服务器上失去会话并且无法获取数据(需要重新登录)

我在 crossdomain.xml 中也有这一行

allow-http-request-headers-from domain="*" headers="*"

ASP.net 服务器端没有问题原因,来自 PHP 的同类调用工作正常。这里是:

$data_string ='{ "Message":"Login", "Data": { "User":"some@email.com", "Password":"somepassword" }}';
$ch = curl_init('https://somedomain.com/someaddress.aspx');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json charset: UTF-8','Content-Length: ' . mb_strlen($data_string)));
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER ,1);
$result = curl_exec($ch);
curl_close($ch);

preg_match('/^Set-Cookie:\s*([^;]*)/mi', $result, $m);
parse_str($m[1], $cookies);
$sessionId = $cookies["ASP_NET_SessionId"];

在下一次通话中,我只是使用该会话变量:

curl_setopt($ch, CURLOPT_COOKIE, "ASP.NET_SessionId=$sessionId; path=/");

一切正常。

我的问题是:我的 Actionscript 代码中缺少什么?或者可能是什么问题?

【问题讨论】:

  • 检查所有事件,即 Urloader 有 IOErrorEvent (help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/…)。在这种情况下,如果您收到 ioerror,您可以安排稍后再次登录尝试。
  • 我没有收到任何错误,在 C# 代码的服务器端我有这个(在我开始之前): if (Session["user"] == null) { return " session error" } 这就是我在 AS3 中得到的答案。
  • 您是否检查过您的应用是否确实收到了正确的 cookie 数据?还有你的服务器是否真的收到了预期的 cookie 标头?根据我的经验,Air 和 cookie 在不同的操作系统/设备上一直很时髦。至少在模拟器中,Air 自己处理 cookie 检索/发送。这应该不是必需的,但尝试将request.manageCookies 设置为false(至少在 Windows 上是必需的)。顺便说一句,跨域限制仅适用于浏览器内容,不适用于应用程序。
  • 非常感谢! :) 该死...我只是放弃了手动 cookie 处理,让 Air 自己做,一切都像魅力一样工作(模拟器和设备):),我还检查了你的建议,实际上我正在杀死原始 cookie从 Air 的请求标头重新发送它时的服务器。另外,您对跨域的看法是正确的,只是忘记了这一点,并尝试尽一切可能:)
  • 很高兴它为您解决,我将添加我的评论作为稍微改写的答案...

标签: php asp.net actionscript-3 air session-cookies


【解决方案1】:

您是否检查过您的应用是否确实收到了正确的 cookie 数据?以及您的服务器是否实际接收到预期的 cookie 标头?

根据我的经验,AIR 和 cookie 在不同的操作系统/设备上一直很时髦。但是,至少在模拟器中,AIR 本身可以很好地处理 cookie 检索/发送(在应用程序生命周期中),因此您可以尝试一下以进一步隔离问题。

理论上它不应该是必要的,但也尝试将request.manageCookies 设置为false(至少在 Windows 上是必需的)以确保 AIR 实际上允许您设置可能的 cookie 标头,否则它会自行定义。

顺便说一句,跨域限制仅适用于浏览器内容,不适用于应用程序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-25
    • 1970-01-01
    • 1970-01-01
    • 2022-06-22
    • 2010-09-17
    • 2016-11-23
    • 1970-01-01
    相关资源
    最近更新 更多