I've debugged Flex for a while and found out that
"Service.ResourceNotFound" comes over from the server.
Since I don't have a clue how to debug web2py, I just dig in pyamf
sources untill I found out that Service.ResourceNotFound is a string
message of UnknownServiceError which is raised in
\pyamf\remoting\gateway\__init__.py at line 395 in 'def
getServiceRequest'.
I can't understandf much from the code of that function, because I'm
not too savvy with Python syntax or pyamf classes but I'm qute sure
that the problem is there. Or at least, this is where the request gets
rejected.
Is there any way to debug this stuff directly? SOS!

On Mar 9, 9:04 pm, iggass <gas...@gmail.com> wrote:
> Hello!
>
> I'm trying to deploy basic connectivity between Flex AS3 application
> and web2py server-side. In order to achieve this noble cause I studied
> the official tutorial (http://www.web2py.com/AlterEgo/default/show/22)
> and the official documentation (http://web2py.com/book/default/section/
> 9/2).
> So, I created two controllers 'rpc' and 'rpc2' as follows:
>
> rpc.py
> ---------------
> from gluon.tools import Service
> service = Service(globals())
>
> def call():
>     session.forget()
>     return service()
>
> @service.amfrpc
> def test():
>     return "Test!!!"
>
> rpc2.py
> ---------------
> import pyamf
> import pyamf.remoting.gateway
>
> def test():
>     return "Test!!!"
>
> services={'test.test':test}
>
> def gateway():
>     base_gateway = pyamf.remoting.gateway.BaseGateway(services)
>     context = pyamf.get_context(pyamf.AMF0)
>     pyamf_request = pyamf.remoting.decode(request.body.read(),
> context)
>     pyamf_response = pyamf.remoting.Envelope(pyamf_request.amfVersion,
> pyamf_request.clientType)
>     for name, message in pyamf_request:
>         pyamf_response[name] = base_gateway.getProcessor(message)
> (message)
>     response.headers['Content-Type'] = pyamf.remoting.CONTENT_TYPE
>     return pyamf.remoting.encode(pyamf_response, context).getvalue()
>
> -------------
>
> After that, I tried accessing exposed amf services using both
> controllers respectively via browser through the following URLs:
>
> http://127.0.0.1:8000/AppTryout/rpc/call/amfrpc/testhttp://127.0.0.1:8000/AppTryout/rpc2/gateway/test
>
> In both cases I recieve similar errors:
>
> forhttp://127.0.0.1:8000/AppTryout/rpc/call/amfrpc/test:
> --------------------------------------------------------------------------- 
> ------
> Traceback (most recent call last):
>   File "gluon/restricted.py", line 173, in restricted
>   File "//server2003/web2py/applications/AppTryout/controllers/
> rpc.py", line 13, in <module>
>   File "gluon/globals.py", line 96, in <lambda>
>   File "//server2003/web2py/applications/AppTryout/controllers/
> rpc.py", line 7, in call
>   File "gluon/tools.py", line 2942, in __call__
>   File "gluon/tools.py", line 2885, in serve_amfrpc
>   File "\\server2003\web2py\library.zip\pyamf\remoting\__init__.py",
> line 634, in decode
>   File "\\server2003\web2py\library.zip\pyamf\util\__init__.py", line
> 322, in read_uchar
>   File "\\server2003\web2py\library.zip\pyamf\util\__init__.py", line
> 298, in _read
>   File "\\server2003\web2py\library.zip\pyamf\util\__init__.py", line
> 646, in read
> IOError: Attempted to read 1 bytes from the buffer but only 0 remain
>
> In file: \\server2003\web2py\applications\AppTryout/controllers/rpc.py
> from gluon.tools import Service
> service = Service(globals())
>
> def call():
>     session.forget()
>     return service()
>
> @service.amfrpc
> def test():
>     return "Test!!!"
>
> response._vars=response._caller(call)
>
> forhttp://127.0.0.1:8000/AppTryout/rpc/call/amfrpc/test:
> --------------------------------------------------------------------------- 
> ------
> Traceback (most recent call last):
>   File "gluon/restricted.py", line 173, in restricted
>   File "//server2003/web2py/applications/AppTryout/controllers/
> rpc2.py", line 18, in <module>
>   File "gluon/globals.py", line 96, in <lambda>
>   File "//server2003/web2py/applications/AppTryout/controllers/
> rpc2.py", line 12, in gateway
>   File "\\server2003\web2py\library.zip\pyamf\remoting\__init__.py",
> line 634, in decode
>   File "\\server2003\web2py\library.zip\pyamf\util\__init__.py", line
> 322, in read_uchar
>   File "\\server2003\web2py\library.zip\pyamf\util\__init__.py", line
> 298, in _read
>   File "\\server2003\web2py\library.zip\pyamf\util\__init__.py", line
> 646, in read
> IOError: Attempted to read 1 bytes from the buffer but only 0 remain
>
> In file: \\server2003\web2py\applications\AppTryout/controllers/
> rpc2.py
> import pyamf
> import pyamf.remoting.gateway
>
> def test():
>     return "Test!!!"
>
> services={'test.test':test}
>
> def gateway():
>     base_gateway = pyamf.remoting.gateway.BaseGateway(services)
>     context = pyamf.get_context(pyamf.AMF0)
>     pyamf_request = pyamf.remoting.decode(request.body.read(),
> context)
>     pyamf_response = pyamf.remoting.Envelope(pyamf_request.amfVersion,
> pyamf_request.clientType)
>     for name, message in pyamf_request:
>         pyamf_response[name] = base_gateway.getProcessor(message)
> (message)
>     response.headers['Content-Type'] = pyamf.remoting.CONTENT_TYPE
>     return pyamf.remoting.encode(pyamf_response, context).getvalue()
> response._vars=response._caller(gateway)
>
> It can be seen that in both cases the error arrises in the statement:
> response._vars=response._caller(...)
> and involves exactly the same code in pyamf module.
>
> In httpserver.log I get:
> 127.0.0.1, 2010-03-09 20:49:52, GET, /AppTryout/rpc/call/amfrpc/test,
> HTTP/1.1, 500, 4.131000
> 127.0.0.1, 2010-03-09 20:50:24, GET, /AppTryout/rpc2/gateway/test,
> HTTP/1.1, 500, 6.098000
>
> --------------------------------------------------------------------------- --
>
> My surmise is thay amfrpc won't work with browser, so I prepared
> simple Flex application to consume these services:
>
> <?xml version="1.0" encoding="utf-8"?>
> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml";
> layout="absolute">
>         <mx:Script>
>                 <![CDATA[
>                         import mx.rpc.events.FaultEvent;
>             import mx.rpc.events.ResultEvent;
>             import mx.controls.Alert;
>
>             private function resultHandler(event:ResultEvent):void
>             {
>                 trace(event.result.toString());
>             }
>
>             private function faultHandler(event:FaultEvent):void
>             {
>                 trace(event.fault.message);
>             }
>
>             private function fire():void
>             {
>                 amfService.test();
>                 amfService2.test();
>             }
>                 ]]>
>         </mx:Script>
>
>     <mx:RemoteObject id="amfService" showBusyCursor="true"
> destination="dest-amfrpc">
>          <mx:method name="test" result="resultHandler(event)"
> fault="faultHandler(event)"/>
>     </mx:RemoteObject>
>     <mx:RemoteObject id="amfService2" showBusyCursor="true"
> destination="dest-amfrpc2">
>          <mx:method name="test" result="resultHandler(event)"
> fault="faultHandler(event)"/>
>     </mx:RemoteObject>
>     <mx:Button x="250" y="150" label="Fire" click="fire();"/>
> </mx:Application>
>
> ------------
>
> Its corresponding services-config.xml looks as follows:
>
> <?xml version="1.0" encoding="UTF-8"?>
> <services-config>
>   <services>
>     <service id="amfrpc-flashremoting-service"
>                  class="flex.messaging.services.RemotingService"
>
> messageTypes="flex.messaging.messages.RemotingMessage">
>             <destination id="dest-amfrpc">
>                 <channels>
>                     <channel ref="ch-amfrpc"/>
>                 </channels>
>                 <properties>
>                     <source>*</source>
>                 </properties>
>             </destination>
>             <destination id="dest-amfrpc2">
>                 <channels>
>                     <channel ref="ch-amfrpc2"/>
>                 </channels>
>                 <properties>
>                     <source>*</source>
>                 </properties>
>             </destination>
>         </service>
>     </services>
>
>     <channels>
>         <channel-definition id="ch-amfrpc"
> class="mx.messaging.channels.AMFChannel">
>             <endpoint uri="http://127.0.0.1:8000/AppTryout/rpc/call/
> amfrpc/test" class="flex.messaging.endpoints.AMFEndpoint"/>
>         </channel-definition>
>         <channel-definition id="ch-amfrpc2"
> class="mx.messaging.channels.AMFChannel">
>             <endpoint uri="http://127.0.0.1:8000/AppTryout/rpc2/
> gateway/test" class="flex.messaging.endpoints.AMFEndpoint"/>
>         </channel-definition>
>     </channels>
> </services-config>
>
> -------
>
> When I run the Flex app, I got the follwing trace:
>
> faultCode:Service.ResourceNotFound faultString:'Unknown service dest-
> amfrpc.test' faultDetail:''
> faultCode:Service.ResourceNotFound faultString:'Unknown service dest-
> amfrpc2.test' faultDetail:''
>
> But httpserver.log says something else this time:
>
> 127.0.0.1, 2010-03-09 20:57:22, POST, /AppTryout/rpc/call/amfrpc/test,
> HTTP/1.1, 200, 4.328000
> 127.0.0.1, 2010-03-09 20:57:27, POST, /AppTryout/rpc2/gateway/test,
> HTTP/1.1, 200, 10.093000
>
> So, Flex reaches the server and gets valid response, but then fails to
> handle it for some reson.
>
> At this moment I'm at a loss, because I don't know whether my mistake
> is at client-side or server-side.
> Any help will be greatly appreciated.
> Thanks!

-- 
You received this message because you are subscribed to the Google Groups 
"web2py-users" group.
To post to this group, send email to web...@googlegroups.com.
To unsubscribe from this group, send email to 
web2py+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/web2py?hl=en.

Reply via email to