Flash remoting connect to vb.net web services(基於 AS2.0 & flashgateway.dll [framework1.1])
利用flash 8 pro作測試
首先安裝 flashremoting_components_flash8.msi
再安裝 flashremoting-net-win-en2.exe , 安裝這個後會自動創建flashremoting虛擬目錄
開始>執行>inetmgr > 默認網站>flashremoting>右鍵屬性>創建應用程序
>http:\\localhost\flashremoting\samples\html\default.htm
測試三個samples
如果第三個samples運行不到, 將C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin 加到環境變數 path中 , 因為裏面有remoting要用到的wsdl.exe
開一個新虛擬目錄 > tester ,裏面有以下檔案
bin
- flashgateway.dll
test.fla
test.asmx
web.config
gateway.aspx
bin 目錄的flashgateway.dll可以到先前flashremoting\bin 找到,把它copy貼入
先創建gateway.aspx, 很簡單的一句
<%@ Page %>
創建web.config
"1.0" encoding=
"utf-8" ?>
defaultLanguage=
"vb"
debug= "true"
/>
"GatewayController" type=
"FlashGateway.Controller.GatewayController,flashgateway" />
requestEncoding=
"utf-8"
responseEncoding= "utf-8"
/>
debug= "true"
/>
responseEncoding= "utf-8"
/>
主要是
test.asmx
<%@ WebService Language="VB" Class="test" %>
Imports System
Imports System.Data
Imports System.Web.Services
Public Class test : Inherits WebService
Public Function Getit() As String
Return "123"
End Function
End Class
Imports System
Imports System.Data
Imports System.Web.Services
Public Class test : Inherits WebService
Return "123"
End Function
End Class
flash remoting connector 的連接方法如下:
test.fla
/*
//第一個方法 : 利到flashgateway.dll ,通過test.asmx?wsdl 在bin創建一test.dll(沒有namespace)及test.cs再調用其test.dll的Getit方法
stop();
//-------------------------------------------------------------
import mx.remoting.Service;
import mx.rpc.FaultEvent;
import mx.remoting.PendingCall;
import mx.rpc.ResultEvent;
import mx.rpc.RelayResponder;
mx.remoting.debug.NetDebug.initialize();
var myService:Service = new Service("http://localhost/tester/gateway.aspx", null, "http://localhost/tester/test.asmx?wsdl", null, null);
var pc:PendingCall = myService.Getit();
pc.responder = new RelayResponder(this, "Getit_Result", "Getit_Fault");
trace("这时,信息还未返回");
function Getit_Result(re:ResultEvent):Void {
trace(re.result);
}
function Getit_Fault(fe:FaultEvent):Void {
trace("接收到错误");
}
*/
stop();
//-------------------------------------------------------------
import mx.remoting.Service;
import mx.rpc.FaultEvent;
import mx.remoting.PendingCall;
import mx.rpc.ResultEvent;
import mx.rpc.RelayResponder;
mx.remoting.debug.NetDebug.initialize();
var myService:Service = new Service("http://localhost/tester/gateway.aspx", null, "http://localhost/tester/test.asmx?wsdl", null, null);
var pc:PendingCall = myService.Getit();
pc.responder = new RelayResponder(this, "Getit_Result", "Getit_Fault");
trace("这时,信息还未返回");
function Getit_Result(re:ResultEvent):Void {
trace(re.result);
}
function Getit_Fault(fe:FaultEvent):Void {
trace("接收到错误");
}
*/
*
//第二個方法: 利到flashgateway.dll ,通過test.asmx?wsdl 在bin創建一test.dll(沒有namespace)及test.cs再調用其test.dll的Getit方法
stop();
import mx.data.components.RemotingConnector;
mx.remoting.debug.NetDebug.initialize();
var my_rc:RemotingConnector = new RemotingConnector();
my_rc.addEventListener("result", Getit_Result);
my_rc.addEventListener("status", Getit_Status);
my_rc.gatewayUrl = "http://localhost/tester/gateway.aspx";
my_rc.methodName = "Getit";
my_rc.serviceName = "http://localhost/tester/test.asmx?wsdl";
my_rc.suppressInvalidCalls = true;
function init():Void {
if (this.inited != undefined) {
return;
} else {
var inited:Boolean = true;
my_rc.params = null;
my_rc.trigger();
}
}
init();
function Getit_Result(ev:Object) {
trace(ev.target.results) ;}
function Getit_Status(stat:Object) {
trace("接收到错误");
}
/*
//第二個方法: 利到flashgateway.dll ,通過test.asmx?wsdl 在bin創建一test.dll(沒有namespace)及test.cs再調用其test.dll的Getit方法
stop();
import mx.data.components.RemotingConnector;
mx.remoting.debug.NetDebug.initialize();
var my_rc:RemotingConnector = new RemotingConnector();
my_rc.addEventListener("result", Getit_Result);
my_rc.addEventListener("status", Getit_Status);
my_rc.gatewayUrl = "http://localhost/tester/gateway.aspx";
my_rc.methodName = "Getit";
my_rc.serviceName = "http://localhost/tester/test.asmx?wsdl";
my_rc.suppressInvalidCalls = true;
function init():Void {
if (this.inited != undefined) {
return;
} else {
var inited:Boolean = true;
my_rc.params = null;
my_rc.trigger();
}
}
init();
function Getit_Result(ev:Object) {
trace(ev.target.results) ;}
function Getit_Status(stat:Object) {
trace("接收到错误");
}
/*
第三個方法:
首先將bin 的test.dll,test.cs 刪去(如果有的話)
接著copy wsdl.exe 和 vbc.exe 到tester目錄
不知道wsdl.exe , vbc.exe在那?
cmd > dir /s wsdl.exe 找找
發現
vbc.exe > C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727
wsdl.exe > C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin
然後cmd >tester 目錄 >運行以下代命令
wsdl /l:vb /n:testvb /out:test.vb http://localhost/tester/test.asmx?wsdl
得到test.vb
再執行
vbc /t:library /out:test.dll /r:system.data.dll /r:system.web.dll /r:system.dll /r:system.xml.dll /r:system.web.services.dll test.vb
得到vb編譯,命名空間為testvb的test.dll
test.fla
/*
//第三個方法 : 不需用到flashgateway.dll , 通過bin的test.dll(預先編譯)調用Getit方法
stop();
import mx.remoting.Service;
import mx.rpc.FaultEvent;
import mx.remoting.PendingCall;
import mx.rpc.ResultEvent;
import mx.rpc.RelayResponder;
mx.remoting.debug.NetDebug.initialize();
var myService:Service = new Service("http://localhost/tester/gateway.aspx", null, "testvb.test", null, null);
var pc:PendingCall = myService.Getit();
pc.responder = new RelayResponder(this, "Getit_Result", "Getit_Fault");
trace("这时,信息还未返回");
function Getit_Result(re:ResultEvent):Void {
trace(re.result);
}
function Getit_Fault(fe:FaultEvent):Void {
trace("接收到错误");
}
*/
stop();
import mx.remoting.Service;
import mx.rpc.FaultEvent;
import mx.remoting.PendingCall;
import mx.rpc.ResultEvent;
import mx.rpc.RelayResponder;
mx.remoting.debug.NetDebug.initialize();
var myService:Service = new Service("http://localhost/tester/gateway.aspx", null, "testvb.test", null, null);
var pc:PendingCall = myService.Getit();
pc.responder = new RelayResponder(this, "Getit_Result", "Getit_Fault");
trace("这时,信息还未返回");
function Getit_Result(re:ResultEvent):Void {
trace(re.result);
}
function Getit_Fault(fe:FaultEvent):Void {
trace("接收到错误");
}
*/
測試成功的話將會trace回 : 123
"接收到錯誤"的話可以查看 視窗>其它面板>netconnection debugger
或者可以查看bin > flash.log
---------------------------------------------------------------------------
其實還有一種連接方式,就是調用remoting class ,以下我們嘗試用這個連接方式連接webservie查詢數據庫.需要文件如下:
bin
- flashgateway.dll
test2.fla
con2mdb.asmx
web.config
gateway.aspx
test.mdb
gateway.aspx , web.config 內容不變.
test.mdb 隨便弄些數據吧
con2mdb.asmx
<%@ WebService Language="VB" Class="con2mdb" %>
imports System.Web
imports System.Web.Services
imports System.Web.Services.Protocols
imports System.Data
imports System.Data.OleDb
Public Class con2mdb
public Function GetData() As DataSet
Dim oConn As OleDbConnection
Dim oComm As OleDbCommand
Dim oData As OleDbDataAdapter
Dim resultSet As New DataSet
Dim oConnect, oQuery As String
oConnect = "Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=C:\\Inetpub\\wwwroot\\tester\test.mdb"
oQuery = "SELECT * FROM main"
oConn = New OleDbConnection(oConnect)
oComm = New OleDbCommand(oQuery, oConn)
oData = New OleDbDataAdapter(oQuery, oConn)
oConn.Open()
oData.Fill(resultSet, "accessTest")
oConn.Close()
Return resultSet
End Function
End Class
imports System.Web
imports System.Web.Services
imports System.Web.Services.Protocols
imports System.Data
imports System.Data.OleDb
Public Class con2mdb
Dim oConn As OleDbConnection
Dim oComm As OleDbCommand
Dim oData As OleDbDataAdapter
Dim resultSet As New DataSet
Dim oConnect, oQuery As String
oConnect = "Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=C:\\Inetpub\\wwwroot\\tester\test.mdb"
oQuery = "SELECT * FROM main"
oConn = New OleDbConnection(oConnect)
oComm = New OleDbCommand(oQuery, oConn)
oData = New OleDbDataAdapter(oQuery, oConn)
oConn.Open()
oData.Fill(resultSet, "accessTest")
oConn.Close()
Return resultSet
End Function
End Class
test.fla
先從視窗內建元件庫>remoting>拉一個remoting class 出來
拖一個remotingconnector 組件到場景,命名為my_rc , ctrl+f7組件檢測器配置如下
場境第一幀:
stop();
import mx.data.components.RemotingConnector;
import mx.remoting.Service;
import mx.rpc.FaultEvent;
import mx.remoting.PendingCall;
import mx.rpc.ResultEvent;
import mx.rpc.RelayResponder;
mx.remoting.debug.NetDebug.initialize();
my_rc.addEventListener("result", GetData_Result);
my_rc.addEventListener("status", GetData_Status);
function init():Void {
if (this.inited != undefined) {
return;
} else {
var inited:Boolean = true;
my_rc.params = null;
my_rc.trigger();
}
}
init();
function GetData_Result(re:ResultEvent):Void {
trace("連接成功");
}
function GetData_Fault(fe:FaultEvent):Void {
trace("接收到错误");
}
import mx.data.components.RemotingConnector;
import mx.remoting.Service;
import mx.rpc.FaultEvent;
import mx.remoting.PendingCall;
import mx.rpc.ResultEvent;
import mx.rpc.RelayResponder;
mx.remoting.debug.NetDebug.initialize();
my_rc.addEventListener("result", GetData_Result);
my_rc.addEventListener("status", GetData_Status);
function init():Void {
if (this.inited != undefined) {
return;
} else {
var inited:Boolean = true;
my_rc.params = null;
my_rc.trigger();
}
}
init();
function GetData_Result(re:ResultEvent):Void {
trace("連接成功");
}
function GetData_Fault(fe:FaultEvent):Void {
trace("接收到错误");
}
ctrl-enter 看到輸出 : 連接成功
查看bin資料夾有沒有con2mdb.dll
有的話即是成功編譯, 記得con2mdb.asmx 最後return 的是什麼?
return 的是一個resultSet 的Dataset
怎檥顯示到flash上?去組件拉一個list component出來,命名為lb
my_rc 組件檢測器>結構
因為return回來的是一個complex object ,我要的是裏面的accessTest
my_rc 組件檢測器>繫結
將accessTest綁定到list的dataProvider, ctrl-enter 結果如下: