The "Tech. Arch."

Architecting Forward ::>

From Ruby Silverlight to Ruby Web Service (with a touch of spice)

After validating I could create a C# Silverlight client calling both document-style SOAP .net web service and an RPC-style SOAP Rails web service, it was time to move to the all-in-Ruby scenario.
The advantages such a scenario would bring include:
– increased developer productivity due to single end-to-end language experience
– greater leverage through the expressiveness and power of the Ruby language
– shorter cycle time due lack of compilation step (especially when running on the Silverlight-specific Chiron development web server)
– wider options in terms of class libraries, SDKs, and tools

So let’s look at what is needed to make the Ruby “all-the-way” option work:
1. The ability to leverage traditional .NET assemblies from Ruby.
2. The Silverlight ServiceModel stack (a subset of WCF, right-sized for the client).

IronRuby allows integration with the .NET platform – even using strongly-typed collections! Not bad for a dynamically typed language :-) !!!
The challenge is that the WCF approach requires the use of .NET attributes to “decorate” the contract definition.

(AsyncPattern=true, Action="/ws_tst/api/GetTime", ReplyAction="*")]

Unfortunately IronRuby does not support that for the time being (still alpha).
So the solution for now is to:
1. Generate and tweak the web service proxy in C#,
2. Package it up in a small assembly
3. Copy the assembly in the Silverlight .xap package to the Silverlight app folder.
4. Add the assembly declaration to the AppManifest.xaml


Then, we can move on to the Silverlight client implementation:
1. Declare our web service proxy assembly and its namespaces

require "RorMonnetUsaComSoap"
include RorMonnetUsaComSoap
include RorMonnetUsaComSoap::RoRServiceReference

2. Instantiate the WCF client generated for our web service port

@svcproxy =

3. Wire up an event handler for the asynchronous web service call (since Silverlight requires asynchronous calls)

@svcproxy.GetTimeCompleted { |sender, args|  txtResults.text = args.result }

4. Wire up a button event handler to request the asynchronous web service call { |sender, args| @svcproxy.GetTimeAsync() }


require "Silverlight"
require "System"
require "System.ServiceModel"

require "RorMonnetUsaComSoap"

include System
include System::Net
include System::ServiceModel

include RorMonnetUsaComSoap

class App < SilverlightApplication

def initialize

@svcproxy = initializeServiceProxy()

# wire up web service callback
@svcproxy.GetTimeCompleted { |sender, args| handle_get_time_completed(sender, args) }

# wire up the button handler { |sender, args| handle_btn_clicked(sender, args) }

end #initialize method

def initializeServiceProxy
txtResults.text = "Initializing the svc proxy ..."
proxy =
txtResults.text = "proxy initialized! ready!"
return proxy

def handle_btn_clicked(sender, args)
txtResults.text = "Ready to invoke the service ..."
txtResults.text = "Going ..."

def handle_get_time_completed(sender, args)
txtResults.text = "Done! [" + args.result.to_s + "]"

end # App class

Et Voilà !


June 12th, 2008 Posted by | Ruby, Silverlight | no comments

No Comments

No comments yet.

Sorry, the comment form is closed at this time.