ServiceStack – Writing C# clients for services

Today lets create a client application for our simple Flight Service using C# code. Writing clients for ServiceStack services using C# is super easy! If you have worked with older  web service related technologies, you may know by experience how difficult it is to create xml requests, serialise data, de-serialise data and etc. At the end of this example you’ll realise how easy it is writing C# client code to consume a service developed using ServiceStack.

First we need to add a consumer project into the solution. For this demonstration, I am going to use a Windows Console Application as my client and I name it “ServiceConsumer”.

AddConsumerProject

Next, we should add a reference to ServiceStack.Client namespace within our client project. To get this done, right-click on the project and select Manage NuGet Packages… from the context menu.

ManagePackages

Then search for ServiceStack.Client and click Install.

AddPackage

This will add the ServiceStack.Client and other supporting ServiceStack references into our client project.

References

Next, we should  add the reference to our service project (see below).

AddServicereference

Now, we are ready to go ahead and write our client code.

If you could remember, our FlightRequest class included two properties, Departure and Arrival. Basically, I am going to write a console application that creates an instance of this request class, populates its Departure and Arrival properties with values passed into the application and pass that request into the service. Finally, I will be writing some code to display the content of the response returned from the service. The following piece of code does it all…

Code

The most important lines in the above code are line 16 and 17. In line 16, I create a new JSON client. Here, I create a new JsonServiceClient object by passing in the base URI of the service. The best way to get the base URI is to launch the service and copy the base address from the service URL (see below).

BaseAddress

You may create other types of clients that could be used with request types such as XML, CSV, SOAP and etc. too. I will show how to create such clients later in this post.

In line 17, I create a new FlightRequest object, assign its two properties with values passed into the application and then pass it to the Post() method of the client. The other parameter that I pass into the Post() method is the desired route to use. If you remember, I had two routes defined for FlightRequest class so, I specify which route that I need to use.  Also, note that I specify the response type in the method call in order to receive a strongly typed response back from the service.

Finally, I have written some code (line 22 to 31) to display the content of response I’ve got back. now, if you press F5 it will start debugging the service. To get the client application kicked off follow, right-click on the client project -> Debug -> Start new instance.

StartNewClientInstance

The following screenshot shows the output response for a sample run of the client application with two input parameters supplied.

Results

In the above example, we used a JsonServiceClient class to initiate a JSON request to the service. As I mentioned before, there are other client classes available to us as well. You may replace line 16 with the following line of code to initiate an XML request. The client application should still function as before.

var client = new XmlServiceClient(“http://localhost:63808”);

The following code lines could be used to create JSV, SOAP 1.1 and SOAP 1.2 clients respectively.

var client = new JsvServiceClient(“http://localhost:63808”);

var client = new Soap11ServiceClient(“http://localhost:63808”);

var client = new Soap12ServiceClient(“http://localhost:63808”);

The client code that I’ve written worked fine but, we can further simplify this code to make it look more simple and sleek. We had to specify the response type in the Post() method but, with a small tweak in the FlightRequest class, we can get rid of this from our client code. All we have to do is to slightly change the FlightRequest class as shown below.

FlightRequestChange

Here, we declare the expected response type related to our request type. Simply, we say that our FlightService returns an object of type FlightResponse when we post a FlightRequest object into the service.

We may even remove the route name parameter from the Post() method call as ServiceStack is intelligent enough to inspect the routes associate with the our request type and sort out the appropriate route to use! So, our simplified client code looks like the following.

CodeImproved

And, our client program still runs with no troubles!

Results

Advertisements

About Dilan Perera

I am a Microsoft .NET evangelist (C#) with more than 8 years of hands on experience in software engineering. I have a Bachelor of Engineering degree and a number of certifications including MCPD, MCTS, MCDBA, MCSD, MCAD, and MCP.
This entry was posted in ServiceStack and tagged . Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s