1 FLEX HttpService错误
[RPC Fault faultString="Security error accessing url" faultCode="Channel.Security.Error" faultDetail="Destination: DefaultHTTP"]
at mx.rpc::AbstractInvoker/http://www.adobe.com/2006/flex/mx/internal::faultHandler()[C:/autobuild/3.2.0/frameworks/projects/rpc/src/mx/rpc/AbstractInvoker.as:220]
at mx.rpc::Responder/fault()[C:/autobuild/3.2.0/frameworks/projects/rpc/src/mx/rpc/Responder.as:53]
at mx.rpc::AsyncRequest/fault()[C:/autobuild/3.2.0/frameworks/projects/rpc/src/mx/rpc/AsyncRequest.as:103]
at DirectHTTPMessageResponder/securityErrorHandler()[C:/autobuild/3.2.0/frameworks/projects/rpc/src/mx/messaging/channels/DirectHTTPChannel.as:389]
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at flash.net::URLLoader/redirectEvent()
关于策略文件的格式(可以在Flash CS3帮助里面的Flash Player安全性——》控制权限概述中找到)
1、针对web应用的策略文件
下面的示例显示了一个策略文件,该文件允许访问源自 *.iflashigame.com 和 192.0.34.166 的 SWF 文件。
<?xml version="1.0"?> <cross-domain-policy> <allow-access-from domain="*.iflashigame.com" /> <allow-access-from domain="192.0.34.166" /> </cross-domain-policy> 注意事项:
默认情况下,策略文件必须命名为 crossdomain.xml,并且必须位于服务器的根目录中。但是,SWF 文件可以通过调用 Security.loadPolicyFile() 方法检查是否为其它名称或位于其它目录中。跨域策略文件仅适用于从其中加载该文件的目录及其子目录。因此,根目录中的策略文件适用于整个服务器,但是从任意子目录加载的策略文件仅适用于该目录及其子目录。
策略文件仅影响对其所在特定服务器的访问。例如,位于 https://www.adobe.com:8080/crossdomain.xml 的策略文件只适用于在端口 8080 通过 HTTPS 对 www.adobe.com 进行的数据加载调用。
2、针对Socket的策略文件
<cross-domain-policy> <allow-access-from domain="*" to-ports="507" /> <allow-access-from domain="*.example.com" to-ports="507,516" /> <allow-access-from domain="*.example2.com" to-ports="516-523" /> <allow-access-from domain="www.example2.com" to-ports="507,516-523" /> <allow-access-from domain="www.example3.com" to-ports="*" /> </cross-domain-policy> 这个策略文件是指定允许哪些域的主机通过那些端口链接。
现象:
跨域访问时,出现如下错误:
[FaultEvent fault=[RPC Fault faultString="Security error accessing url" faultCode="Channel.Security.Error" faultDetail="Destination: DefaultHTTP"] messageId="30264797-379F-313E-3D8A-B7ADD21393B5" type="fault" bubbles=false cancelable=true eventPhase=2]
解决办法:
<?xml version="1.0"?> <!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd"> <cross-domain-policy> <site-control permitted-cross-domain-policies="all" /> <allow-access-from domain="*" secure="true" /> <allow-http-request-headers-from domain="*" headers="*"/> </cross-domain-policy>
swf文件跨域访问的时候,会报以下错误:
[RPC Fault faultString="Security error accessing url" faultCode="Channel.Security.Error" faultDetail="Destination: DefaultHTTP"]
at mx.rpc::AbstractInvoker/http://www.adobe.com/2006/flex/mx/internal::faultHandler()
at mx.rpc::Responder/fault()
at mx.rpc::AsyncRequest/fault()
at DirectHTTPMessageResponder/securityErrorHandler()
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at flash.net::URLLoader/redirectEvent()
解决办法是在webservice(或者httpservice)所在网站的根目录下建立一个名为crossdomain.xml的文件,内容如下:
<?xml version="1.0"?>
<cross-domain-policy>
<allow-access-from domain="*" />
<allow-http-request-headers-from domain="*" headers="*"/>
</cross-domain-policy>
其中的*符号可以根据你的实际需要设置,表示允许访问该域的域名,比如只允许来自chenfeisoft.com的页面访问,可以设置如下:
<cross-domain-policy>
<allow-access-from domain="*.chenfeisoft.com" />
<allow-http-request-headers-from domain="*.chenfeisoft.com" headers="*"/>
</cross-domain-policy>
如果你要带调用的webservice不在自己可以控制的服务器上,还可以用javascript写一个本地代理来访问,比如proxy.asp
<%@LANGUAGE="JSCRIPT" CODEPAGE="65001"%>
<%
with (Response) {
Charset = "utf-8";
Buffer = true;
Expires = -10;
}
function Proxy (url) {
this.url = url;
this.write = function () {
if (url.length == 0 || url == undefined)
error("URL 不能为空");
var x = new ActiveXObject("Microsoft.XMLHTTP");
x.open("GET", this.url, false);
x.send();
Response.Write(x.responseText);
x = null;
}
function error (message) {
Response.Write(message);
Response.End();
}
}
var proxy = new Proxy( String(Request.QueryString) );
proxy.write();
%>
可以通过www.yourdonmain.com/proxy.asp?http://www.destination.com/service.xml来访问
2 VerifyError: Error #1014: 无法找到类 flash.filesystem::File。
at global$init()
at <anonymous>()[D:/FlexWorkspace/FileUpload/src/FileUpload.mxml:0]
at Function/http://adobe.com/AS3/2006/builtin::call()
at mx.core::ComponentDescriptor/get properties()[C:/autobuild/3.2.0/frameworks/projects/framework/src/mx/core/ComponentDescriptor.as:241]
at mx.core::Application/initialize()[C:/autobuild/3.2.0/frameworks/projects/framework/src/mx/core/Application.as:821]
at FileUpload/initialize()[D:/FlexWorkspace/FileUpload/src/FileUpload.mxml:0]
at mx.managers::SystemManager/http://www.adobe.com/2006/flex/mx/internal::childAdded()[C:/autobuild/3.2.0/frameworks/projects/framework/src/mx/managers/SystemManager.as:2009]
at mx.managers::SystemManager/initializeTopLevelWindow()[C:/autobuild/3.2.0/frameworks/projects/framework/src/mx/managers/SystemManager.as:3234]
at mx.managers::SystemManager/http://www.adobe.com/2006/flex/mx/internal::docFrameHandler()[C:/autobuild/3.2.0/frameworks/projects/framework/src/mx/managers/SystemManager.as:3064]
问题原因:The AIR project template is configured to start ADL automatically when you press F5
操作方式不对,造成了上面的原因。