Avatar billede priestie Nybegynder
25. november 2005 - 06:02 Der er 10 kommentarer og
1 løsning

Problemer med connect til Flash remoting

Hej!

Jeg er igang med at udvikle en Flash applikation til online kurser, og benytter til formålet Flash remoting. Jeg har fået det hele til at fungere, så nogle små testservices kører som de skal når de bliver kørt fra Flash Professional 8. Men det virker kun på nogle computere, og ikke på andre, når jeg eksekverer den genererede *.swf. Jeg har eksempelvis prøvet at kører det via mine ungers PC, hvor det startede med at køre fint, men efter at have opgraderet til Flash player 8, virker det ikke mere. Det har heller aldring virket fra min egen PC, hvor det jo ellers fuingere fint kørt fra Flash Professional 8.
Er der nogle bestemte ting jeg skal være opmærksom på, i forhold til dette problem?

I kan se den lille test her: http://hvaal.safeon.dk

Jeg benytter OpenAMF og Jetty som servlet server.
Jeg benytter OBedit, men lige nu bruger jeg det kun til test output.

********** Code snip begin *********
import  mx.remoting.*;

trace("Executing");
_root.editingPane.text = "";

NetServices.setDefaultGatewayUrl("http://safeon.dk/hvaal/gateway");
gatewayConnection = NetServices.createGatewayConnection();
servletService = gatewayConnection.getService("com.hvaal.HVAALServletServices", this);

trace("Calling services");
servletService.ping();
servletService.listLessonTypes();
servletService.listLessons("Text Lesson");
servletService.createLesson("Text Lesson", "Lesson 1", "The first lesson, that will help you get your ass moving");
servletService.listLessons("Text Lesson");
servletService.removeLesson("Text Lesson", "Lesson 1");
servletService.listLessons("Text Lesson");

function ping_Result (result)
{
  trace("ping call returned");
  if (result=handleResult(result)) {
      _root.editingPane.text += result;
  } else {
        //error 
  }
}

function listLessonTypes_Result (result)
{
  trace("listLessonTypes call returned");
  if (result=handleResult(result)) {
    _root.editingPane.text += "Listing available Lesson Types: " + result;
  } else {
    //error 
  }
}

function listLessons_Result (result)
{
  trace("listLessons call returned");
  if (result=handleResult(result)) {
    _root.editingPane.text += "Listing available Lessons: " + result;
  } else {
    //error 
  }
}

function createLesson_Result (result)
{
  trace("createLesson call returned");
  if (result=handleResult(result)) {
    _root.editingPane.text += result;
  } else {
    //error 
  }
}

function removeLesson_Result (result)
{
  trace("removeLesson call returned");
  if (result=handleResult(result)) {
    _root.editingPane.text += result;
  } else {
    //error 
  }
}

function handleResult (result) :Object {
    if (result["error"]) {
        trace("Handling error");
        _root.editingPane.text += "A Server error occured: " + result["error"];
        return null;
    }
    return result["result"];
}
********** Code snip end *********
Avatar billede barklund Nybegynder
25. november 2005 - 09:22 #1
Sandsynligvis klassisk crossdomain-overtrædelse. Du må ikke forbinde fra hvaal.safeon.dk til safeon.dk. Flash vil automatisk forsøge at loade en policy fra safeon.dk/crossdomain.xml[1,2]. Denne skal blot indeholde:

<?xml version="1.0"?>
<cross-domain-policy>
  <allow-access-from domain="hvaal.safeon.dk" />
</cross-domain-policy>

Så kan du forbinde. Du kan også lægge ovenstående i en vilkårlig fil placeret et vilkårligt sted (hvis du bruger FP 7,0,19,0 eller nyere) og hente den med System.security.loadPolicyFile()[3].

:)

[1] http://livedocs.macromedia.com/flash/8/main/00001621.html
[2] http://www.macromedia.com/devnet/flash/articles/fplayer_security.html
[3] http://livedocs.macromedia.com/flash/8/main/00002649.html

--
Morten Barklund
Avatar billede priestie Nybegynder
25. november 2005 - 10:49 #2
Tak for svaret Morten, men det er ikke cross domain calls der er problemet. Flash remoting skulle ikke behøve denne XML fil for at fungere. Det er bla. en af fordelene ved Flash Remoting. Jeg har jo også oplevet at kunne køre *.swf'en uden problemer fra samme computer der senere ikke ville køre den.

priestie
Avatar billede barklund Nybegynder
25. november 2005 - 13:31 #3
Flash Remoting har ikke noget med det at gøre. Jeg bruger AMFPHP mange steder, og alle disse steder har crossdomain været nødvendig. Du kan jo ikke lægge en fil op på din server, der tilgår Flash Remoting på en fremmed server, uden du har fået lov. Det ville da være fjollet at sænke sikkerheden, bare fordi man brugte en anden metode. Crossdomain er medtaget af sikkerhedsgrunde - det er ikke bare besværligt :)

Hvis du før brugte Flash Player 6 og har opgraderet til 8, så ændrede sikkerhedsmodellen sig omkring load på tværs af domæner. I FP6 og tidligere kunne foo.bar.com godt forbinde til boing.foo.bar.com eller bar.com. Det kan man ikke længere - nu skal domænerne være _helt_ ens.

:)

--
Morten Barklund
Avatar billede priestie Nybegynder
25. november 2005 - 15:10 #4
Hej Igen Morten!

Remoting har vel netop noget med OpenAMF at gøre. Dette kunne ikke lade sig gøre uden.
Jeg har som sagt haft det til at virke uden nogen som helst form for crossdomain.xml filer, derfor tror jeg ikke du har ret i din antagelse.
Jeg har flere steder læst mig til at Flash Remoting IKKE benytter crossdamain.xml filer. Det er vel også fornuftigt nok, hvis man betragter sine Remoting services som almindelige public webservices. Der er jo også rig mulighed for at lave authentication med Remoting.
Nu vel, jeg har forsøgt mig med policy filen, og det ændre desværre ikke noget.
Jeg har lagt følgende fil på safeon.dk roden og i safeon.dk/hvaal:

crossdomain.xml:
**************  File Begin  *************
<?xml version="1.0"?>
<!-- http://www.foo.com/crossdomain.xml -->
<cross-domain-policy>
  <allow-access-from domain="http://hvaal.safeon.dk" />
</cross-domain-policy>
********** File End  ***********


Samtidig har jeg tilføjet følgende umiddelbart før oprettelsen af gatewayforbindelsen i Flash filen:

System.security.loadPolicyFile("http://safeon.dk/crossdomain.xml");

Jeg ved ikke om det er korrekt gjort, men ellers bliver det forhåbentlig kommenteret.

priestie
Avatar billede barklund Nybegynder
25. november 2005 - 17:01 #5
Jeg siger blot, at remoting ikke har noget med crossdomain at gøre. Jeg er overbevist om, at crossdomain foregår uafhængigt at forbindelsesmetoden - om det er XMLSocket, LoadVars, XML eller NetServices. OpenAMF er netop - ligesom AMFPHP - flash remoting :)

Jeg har lige testet med en pakkesniffer på et af mine seneste projekter (http://ombygningsspillet.dk) og der kan jeg se, at selvom jeg ved at klienten ikke bruger System.security.loadPolicyFile (hvilket jo vil hente en fil uanset om klienten skal eller ej), så bliver crossdomain.xml hentet.

Dog, når jeg går ind på http://hvaal.safeon.dk, så ryger jeg over til http://himselfandco.dk/hvaal/hvaal.swf - og så er det lige pludselig et helt tredje domæne, der er med i spil. Eller tager jeg fejl?

--
Morten Barklund
Avatar billede priestie Nybegynder
26. november 2005 - 10:24 #6
Har haft lidt bøvl med at logge på eksperten.dk, men nu lykkedes det.

Hej Morten!

Ja, jeg havde lige glemt at jeg har sat noget forward op på serveren, sorry.

Jeg faldt lige over en artikel der bekræfter at cross domain policy filer ikke er nødvendig ved brug af flash remoting: http://www.actionscript.com/index.php/fw/1/web-services-and-flash-remoting/
Det er dog ikke bevis for at din udlægning ikke er rigtig, fyren kan jo tage fejl.

Jeg har ændret forward på serveren, så der forwardes til safeon.dk, istedet for himselfandco.dk, og nu virker det tilsyneladende. Det er underligt, da det ikke virkede med himselfandco.dk, selvom jeg tilføjede himselfandco.dk til crossdomain.xml filen. Det kører nu uden crossdomain.xml, men nu kører det hele jo også inden for samme domæne, så frem og tilbage var lige langt.

Jeg er ikke overbevist om at det er et cross domain problem, men jeg giver alligevel point til Barklund.

priestie
Avatar billede priestie Nybegynder
26. november 2005 - 10:31 #7
Er der kendte problemer med Firefox or eksperten.dk?
Jeg synes ikke det kan lade sig gøre at acceptere svaret i Firefox
Avatar billede barklund Nybegynder
26. november 2005 - 11:04 #8
Han skriver:

"Flash Remoting enables you to bypass the security sandbox issue and utilize remote data from web services by creating a proxy for your remote service locally."

Altså, det betyder at du stadig tilgår din egen server på dit eget domæne (som en proxy) og at denne server så "forward'er" din forespørgsel til en server ude i byen og sender svaret tilbage. Han skriver _ikke_ at man fra flash direkte kalder en webservice på et andet domæne. Denne teknik er en kendt metode. :)

Mht. accept af svar, så skal du vælge mit navn fra listen af mulige navne (som kun består af mit navn dog), før du kan acceptere det :)

--
Morten Barklund
Avatar billede barklund Nybegynder
26. november 2005 - 11:07 #9
Og jeg er overbevist om, at det var et crossdomain problem. Jeg kunne se, at da jeg åbnede filen, så forsøgte flash at hente en crossdomain.xml fra den anden server, men at den tilsyneladende ikke gav de rette rettigheder :) Du skal _altid_ bruge crossdomain på tværs af domæner - samt hvis du skal forbinde til XMLSocket under port 1024.

--
Morten Barklund
Avatar billede priestie Nybegynder
26. november 2005 - 11:18 #10
Okay, jeg forstår. Det er altså ikke noget nyt ved Flash Remoting hvad angår cross domain access, så artikeln leverer gammel vin på nye flasker.

Jeg havde ikke lige luret finten med at man lige skulle selecte dit navn. Jeg gik ud fra at de li'som kunne regne ud at det var dig der skulle ha' pointene, når du var den eneste på listen.

Tak for det!

priestie
Avatar billede barklund Nybegynder
26. november 2005 - 12:09 #11
Tja, artiklen redegører for, hvorledes man bruger en proxy-service, hvilket er interessant nok - men ikke andet end det :)

Tark for points :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester