我正在使用URLLoader将一些键/值对发送到php脚本,然后将其转换为电子邮件,发送(或不发送),然后回复带有响应的字符串。
起初它工作正常。 URLLoader发布,一分钟后我收到了我的电子邮件,但由于某种原因,我没有得到我的回复。事实上,我的COMPLETE事件似乎根本没有发生。这让我感到困惑,因为如果我收到我的电子邮件,我知道我必须正确发送所有内容。这是我的代码:
public class Mailman{
public static const METHOD:String = URLRequestMethod.POST;
public static const ACTION:String = "mailer.php";
public static var myLoader:URLLoader = new URLLoader();
private static function onMessageProgress(e:Event){
var L:URLLoader = e.target as URLLoader;
Output.trace("PROGRESS: "+L.bytesLoaded+"/"+L.bytesTotal);
for(var k in L){
Output.trace(" "+k+": "+L[k]);
}
}
private static function onOpen(e:Event){
Output.trace("Connection opened");
}
private static function onComplete(e:Event){
Output.trace("Complete!");
}
private static function onStatusChange(e:HTTPStatusEvent){
Output.trace("Status Changed to "+e.status);
}
private static function onMessageFail(e:Event){
PanelManager.alert("ERROR: Could not send your request. Please try again later.");
}
public static function sendMessage(recipient:String,subject:String,message:String){
var _vars:URLVariables = new URLVariables();
_vars.recipient = recipient;
_vars.subject = subject;
_vars.message = message;
var req:URLRequest = new URLRequest(ACTION);
req.data = _vars;
req.method = METHOD;
myLoader.dataFormat = URLLoaderDataFormat.VARIABLES;
myLoader.addEventListener(ProgressEvent.PROGRESS,onMessageProgress);
myLoader.addEventListener(Event.OPEN,onOpen);
myLoader.addEventListener(Event.COMPLETE,onComplete);
myLoader.addEventListener(HTTPStatusEvent.HTTP_STATUS,onStatusChange);
myLoader.addEventListener(IOErrorEvent.IO_ERROR,onMessageFail);
myLoader.addEventListener(SecurityErrorEvent.SECURITY_ERROR,onMessageFail);
myLoader.load(req);
}
public static function test(){
sendMessage("john@example.com","test","this is a test message.");
}
function Mailman(){}
}
当我致电Mailman.test()
时,我收到的电子邮件完全像我预期的那样,这就是追踪:
Connection opened PROGRESS: 45/45 Status Changed to 0
这怎么可能?如果我正确理解文档,Open事件发生在我开始下载我的响应时,并且显然正在发生,那么如何才能获得http状态为0?有什么想法吗?
答案 0 :(得分:4)
我找到了。
问题出在URLLoader的dataFormat上。这是您获得的内容的格式,而不是您发送的内容。我把它切换到URLLoaderDataFormat.TEXT
并且效果很好。
答案 1 :(得分:1)
这可能发生的另一个原因 - 如果您在注册事件侦听器时使用弱引用,并且不保留对URLLoader实例和处理事件的实例的引用,GC可能会在它们收到任何事件之前清除它们事件
//make sure the URLLoader and onComplete instances are not local vars
var req:URLRequest = new URLRequest("dosomething.php");
myLoader.addEventListener(Event.COMPLETE, onComplete, false, 0, TRUE);
myLoader.load(req);
答案 2 :(得分:0)
好的,我发现答案在我的情况下是.NET页面,它负责Chrome中的Status = 0。我们在编写响应发送回闪存之后在.net页面中执行的操作,我们关闭了重置页面的响应对象,因为Chrome显示状态= 0并且无法呈现结果。在评论出response.close后,它开始正常工作。 我写了这个问题的经验以及我如何能够在http://viveklakhanpal.wordpress.com/2010/07/01/error-2032ioerror/
解决它谢谢, 的Vivek。