PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : FLEX >> .NET webservice datentyp problem


tuxedo
30.05.2007, 10:54
hi leute...

leider stehe ich wieder mal etwas auf dem schlauch.
ich habe in .NET einen simplen webservice geschrieben, welcher mir auch
brav beim testen im browser den output liefert.

leider kann ich den service zwar via flex connecten, bekomme aber umgehend
beim zugriff auf die methode eine fehlermeldung: BadWSDL....
recherchen ergaben, das FLEX sich anscheinend am verwendeten datentyp DataSet (VB/C#) stört und schlicht und ergreifend keinen bock hat, den kram
zu parsen.

die frage die sich nun stellt:
a) hat jemand schonmal erfahrungen mit diesem problem gemacht?
b) gibt es ein simles beispiel mit db-zugriff auf .NET/Flex basis, wie man es
richtig macht?

c#

using System;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Data;
using System.Data.SqlClient;

[WebService(Namespace = "http://microsoft.com/webservices/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class webService : System.Web.Services.WebService
{

DataSet _returnDS = new DataSet();

public webService()
{

}

private DataSet sendSQLQuery(String querySQL)
{
String _sqlServ = "blabla";
String _sqlCmd = querySQL;
SqlConnection sql_con = new SqlConnection(_sqlServ);
DataSet sql_ret = new DataSet();
SqlDataAdapter sql_da = new SqlDataAdapter(_sqlCmd, sql_con);

try
{
sql_con.Open();
sql_da.Fill(sql_ret);
}
catch (SqlException ex)
{
}
finally
{
sql_con.Close();
}
return sql_ret;
}

/* getDepartments (); */
[WebMethod(Description = "blabla")]
public DataSet getDepartments()
{
_returnDS = sendSQLQuery("SELECT blabla,blabla FROM tblblabla");
return _returnDS;
}

}



flex für WS

/*
retrieves and computes the url under which the
webservice should be available.
returns: nothing
*/
import mx.rpc.soap.WebService;
import mx.rpc.events.FaultEvent;
import mx.rpc.soap.*;

[Bindable] public var webserviceURL:String;
[Bindable] public var tool_ws:mx.rpc.soap.WebService;

public function setWebservice ():void
{

tool_ws = new mx.rpc.soap.WebService();
if (flashVars.serviceURL)
{
serverURL = flashVars.serviceURL;
} else {
serverURL = "http://blabla";
}

webserviceURL = serverURL + "/Service.asmx?WSDL";
trace ("RESET TO >> webserviceURL: " + webserviceURL);

tool_ws.useProxy = false;
tool_ws.wsdl = webserviceURL;


if (tool_ws.canLoadWSDL())
{
tool_ws.loadWSDL();
}
tool_ws.getDepartments.addEventListener("result", fillDepartmentCombos);
tool_ws.addEventListener("fault", faultHandler);

}

public function faultHandler(event:FaultEvent):void {
trace("event.message: "+event.message);
trace("event.fault: "+event.fault);
}


FLEX aufruf

public function init():void
{
flashVars = Application.application.parameters;
setWebservice();
tool_ws.getDepartments();
}




wäre über jeden tip sehr verbunden.

danke vielmals

gruss

tux

bort
30.05.2007, 16:42
Die Frage ist, wie die WSDL aussieht, bzw. als was der Rückgabewert der getDepartments() in WSDL typsiert ist. Wenn es ein complexType ist, dann sollte alles super sein.

Was auf jeden Fall geht (sowohl mit .NET 1.1 als auch .NET 2.0) ist das hin- und hersenden von Collections zwischen .NET und Flex, das haben wir in diversen Projekten schon gemachtt. Ich könnte mir denken, dass es an dem DataSet liegt.

Gruß,
Dirk.

rmich
31.05.2007, 06:50
hallo,

wir hatten schon mal ein ähnliches Problem, das lag hauptsächlich daran, dass das WSDL in c# ein wenig zu komplex erstellt wurde (automatisch), mit eingebundenen "unterschemen". Darauf konnten wir damals keine richtigen Requests absetzen und haben immer den "Bad WSDL" - Fehler bekommen.
Wir haben uns dann so beholfen, dass wir den c#-Teil umgeschrieben haben, so dass das ganze WSDL in einer File liegt ohne imports ...

seitdem klappts ...

lg
michi

bort
31.05.2007, 07:35
prima, um so besser!

Gruß,
Dirk.