0

プロジェクト: ASP.net に接続した Android 用 Adob​​e Air。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 コードに欠けているものは何ですか? または、何が問題になる可能性がありますか?

4

1 に答える 1

0

アプリが実際に正しい Cookie データを受け取ったかどうかを確認しましたか? また、予想される Cookie ヘッダーがサーバーによって実際に受信されているかどうかもわかりません。

私の経験では、AIR と Cookie は、さまざまな OS/デバイスで常に非常にファンキーでした。ただし、少なくともエミュレーターでは、AIR は (アプリケーションのライフサイクル中に) Cookie の取得/送信を適切に処理するため、問題をさらに切り分けるために試してみることができます。

理論的には必要ありませんが、(少なくとも Windows では必要です) に設定request.manageCookiesして、AIR が独自に定義する可能性のある Cookie ヘッダーを実際に設定できるようにしてみてください。false

ところで、クロスドメインの制限はブラウザのコンテンツのみに適用され、アプリには適用されません。

于 2013-09-16T19:07:13.717 に答える