desalasworks presents:

a selection of works by steven de salas

SEEK Role Requirements

Full Stack JavaScript contract role working on SEEK User Interfaces and AWS hosted API’s.

Steven joined the ‘Role Requirements’ team to help deliver great candidate matching. Millions of job applications are now getting scored and ranked for role suitability every year, resulting in significant time savings to users of the SEEK platform.

The majority of the work involved various enhancements to the back-end capability in the form of AWS-hosted micro-service APIs, and some user interface updates to accommodate improvements to job-seeker and hirer experiences.

Working in a Continuosly Deployed, Agile environment with Node.Js, Angular, Knockout, Jasmine, Karma, Gulp, TeamCity, LESS, Microservices / APIs, PACT, Swagger, Golang, DynamoDB, C#, SQL Server, Docker, Serverless, SNS/SQS, Lambdas, AWS DevOps.


Markit Commission Manager

Commission Manager is a trade reconciliation tool enabling brokers and funds in the worlds largest financial institutions to settle their commission differences.

The Project

The project involved a standardized platform to aggregate and manage trade information, commission balances and vendor invoices and payments.


Markit Commission Manager enables users to reconcile their trading commissions with multiple counterparties and then instruct those counterparties to pay for research and brokerage services – all from a single platform. This efficient workflow eases the administrative burden of managing multiple commission arrangements.

The functionality is centered around trade reconciliation, raising of invoices and managing balance differences.

  • Detailed reporting of balance, trade and invoice information
  • Efficient tools to manage and highlight trade breaks
  • Administrative configurations for new users, tolerance levels, and arrangements
  • Compliance tracking of interactions within the Commission Manager system

Business Partner Integration

In addition, it was necessary to provide systems integration with all broker-dealers that were involved in the project.

Comments on the Commission Manager platform

UserSofia Rossato – Head of Markit Research Manager at Markit

Markit Commission Manager is the latest addition to our Markit Research Manager range of services. Our objective is to enable investment firms to manage their entire research workflow – including sourcing research, tracking corporate access, voting on brokers and managing research commissions – from one single platform to bring greater efficiency and internal visibility to the whole process. Markit Commission Manager is the final piece in the jigsaw. We have partnered closely with BofA Merrill Lynch, Barclays Capital, Citi, Credit Suisse, Deutsche Bank, Goldman Sachs, J.P. Morgan and Morgan Stanley to ensure the platform meets the needs of the industry.

UserFrank Volino – Head of Global Commission Management Services at Citi

This platform is good news for buy-side and sell-side alike. It will allow the buy-side to use a standardised set of tools to manage their commission credits at multiple broker-dealers. We are very pleased to be part of this important industry initiative. This platform is in a strong position to become the industry standard.

Commission Manager in the News

07 Oct 2011
Markit launches commission management platform

04 Oct 2011
Broker-Dealers Fund Markit’s New Commission Management Platform

How to obtain SOAP Request body in C# Web Services

Microsoft left something out when designing web services, fortunately there is a nifty way to obtain the original SOAP request within a C# web service.

I’ve written an article on this topic before. Its possible to obtain the SOAP request body for logging purposes by using SoapExtensions. And that’s all well and good if you want to log the traffic between your SOAP web service and the outside world. But what if you want to change the behaviour of your web services based on the input that comes in?

Say for example, you want to validate your SOAP request against an XML schema to enforce additional validation than what comes out of the box with .NET by default.

The process is quite simple, you need to find the Request object and load the contents of little known property called ‘InputStream‘. You can mine the contents of the SOAP request and load them into an XML document easily as follows:

Creating an ‘Echo’ Soap Request

Using this technique we can create a simple Web Service that performs a simple ‘Echo’ of whatever you send into it. See the following code:

using System;
using System.Collections.Generic;
using System.Web;
using System.Xml;
using System.IO;
using System.Text;
using System.Web.Services;
using System.Web.Services.Protocols;

namespace SoapRequestEcho
  Namespace = "http://soap.request.echo.com/",
  Name = "SoapRequestEcho")]
  public class EchoWebService : WebService
    [WebMethod(Description = "Echo Soap Request")]
    public XmlDocument EchoSoapRequest(int input)
      // Initialize soap request XML
      XmlDocument xmlSoapRequest = new XmlDocument();
      // Get raw request body
      using (Stream receiveStream = HttpContext.Current.Request.InputStream)
        // Move to begining of input stream and read
        receiveStream.Position = 0;
        using (StreamReader readStream = 
                               new StreamReader(receiveStream, Encoding.UTF8))
          // Load into XML document
      // Return
      return xmlSoapRequest;

Testing our Soap Request

We can quickly test our SOAP request and check that we are processing whatever XML is being sent in and its coming out the other side untouched.

Next Steps: Performing Schema Validation

Now you can do what you want with your xmlSoapRequest object. It’ll contain exactly the same request as was sent into SOAP in the first place.

If you are after schema validation.The next step is to populate the xmlSoapRequest.Schemas property and then fire off the xmlSoapRequest.Validate() method.

Piece of cake.

Value Trader

Value Trader is a tool that calculates stock prices based on value fundamentals from Balance Sheet and Profit and Loss statements. Feel free to use it to determine the financial health and estimated value of your stocks.

Live Address


The Landing Page

The landing page provides concise information on a few selected companies based on a “Watchlist”. These are chosen by investors so that they feature every time they come and visit.

Company Details Page

When drilling down into an individual company. The system provides information by looking at financial data over the past few years to determine general health of the company, as well as provide recommendations based on price (by comparing it to the book value and earnings of the company).

Designed for iPhone

The design has been further enhanced to look good on mobile devices, using a mix of small and large type so the important information is clearly displayed even on a small screen.

IP Based Security

The website makes use of IP addresses to authenticate users. The following advantages:

  • Only need to authenticate once (per location).
  • User locations are traced by a collection of IP addresses associated to an email.
  • There are measures in place to detect SQL Injection, Denial of Service and Dictionary Attacks. If a single location tries to hack the site all associated IP addresses are automatically denied access.

AJAX database access in C# – The simple way

Today, I’m going to throw the Microsoft textbook out the window and show you a really easy way to get your database records into a JavaScript application. Minimal hassle – maximum bang for your buck.

First, I’m assuming you chose a JavaScript framework such as Ext JS, Dojo, Yahoo UI, JQuery or any other fine library for your front-end widgets. If so then congratulations, this article is just for you.

The trick is to leave the middle-tier c# layer as thin as possible, implementing only the things your client layer cant do reliably: Security and Data Access.

In this example I am only showing how to write minimal code for Data Access, Security is too long a topic for a single article.


Say you have a database with products in it. For this example I am using the Northwind database:


Here is some C# code I wrote earlier to open up the database and read the first record. If you want some examples of valid connection strings you can look here and here.

Here is the output when you run this code in your browser:

The magic here happens in lines 32 and 38.

Line 32 uses DataTable.Load() to get the database contents into a .NET data table as follows:

32     table.Load(reader, LoadOption.Upsert);

Line 38 uses the DataTable.WriteXml() method to write the contents of the table in XML format as a HTTP response.

38     table.WriteXml(writer);

Now in order to go one step further, your AJAX application needs to read INDIVIDUAL records, that means one at a time, and show them to the user.

Here is some modifications I made to the earlier code for this purpose:

And if you run this code and insert a “?ID=8” at the end of your request (which you can easily append within javascript) you get the following result:

And thats it.

So where is the trick? Is that everything?

Ahh.. For those accustomed to programming ASP.NET I guess it comes as a bit of a surprise that it would be so easy to get XML formatted records out to the client layer.

Surely there has to be a catch somewhere? … A WCF service with implemented data contracts? An Object-Relational Mapping framework operating behind the scenes? Or at least a strongly typed Collection using Generics?

Nope, thats it. You can do this the hard way, but that’s not why you are reading this article. So now you can take off your C# hat and put on the JavaScript one because the rest of the logic goes on the client layer so that users can get the most of their UI experience.


Here is the source code I used in this example, there are 2 files here: Product.aspx and Product.aspx.cs (code-behind) so I’ve zipped them up into this archive:


You are free to copy the code here but since you are not paying me for it I accept no liability if your site goes topsy-turvy. One more free tip, if you are going to put this into production you may want to use a Generic Handler (.ashx file) instead, its more light-weight and you don’t need all the functionality in the Page class.

Please note: I’ve left you the section “WRITING TO THE DATABASE” for a separate article.

ESPA Online Checkout

E-commerce website featuring relaxation and skincare products by UK Spa design and management company. The project involved client checkout and ordering process embedded in existing Content Management solution.


Development of The Checkout Process

  • Enabling taxes and currency assignment based on IP address geo-location
  • Assigning and applying promotional codes,
  • Ajax-based interaction and shopping cart review
  • Payment and warehouse integration
  • Order confirmation email
  • Integration into existing Sitefinity CMS templating.
  • As well as several other related features..

ESPA Checkout

The Checkout Process – Part 2

  • VAT calculations on last minute changes
  • User Experience – Ajax accordion UI features
  • Credit card detail verification
  • Payment integration
  • Warehouse order forwarding

ESPA Payment

Developing the Shopping Experience

  • Integrating the bespoke ASP.NET shopping cart into the existing website
  • Developing enhanced user-experience components such as wishlist for favourite products
  • Reviewing and testing complete process

ESPA Shopping Experience

Designing Email Feedback

  • Creating suitable email layouts based on design specifications
  • Testing on email clients such Gmail, MSN, Outlook, Yahoo etc
  • Integrating with existing order system after warehouse confirmation

ESPA Order Email

Tracking and Logging User Access

  • Desigining object and database model for logging and user/product tracking
  • Integrating model into existing website infrastructure
  • Testing high usage volumes
  • Producing email reports looking at statistics on number of orders, products purchased etc

Logging SOAP Messages In .NET

C# Web Services provide an easy interface to incoming SOAP data because the SOAP message has already been deserialised at the entry point of a WebMethod.

The downside is that sometimes you’ll need to have access to the full SOAP request: body, headers and everything for tasks such as diagnosing any errors (which message broke the web service) or providing graceful handling of third party web services.

At first you’d think that the Request object can provide this information with methods such as Request.BinaryRead() but unfortunately when you’re using SOAP all you get there is a querystring.

The solution here is to use the SOAP Extensions. Here is some sample code:

public class SoapMessageLogger : SoapExtension
public override void ProcessMessage(SoapMessage message)
case SoapMessageStage.BeforeDeserialize:
LogResponse(message); break;
case SoapMessageStage.AfterSerialize:
LogResponse(message); break;

// Do nothing on other states
case SoapMessageStage.AfterDeserialize;
case SoapMessageStage.BeforeSerialize;
default: break;

More info on this can be found here and here.

UTAS Network Monitor

Network Monitor tracking all essential student services (email, print servers, file servers, internet connection). Status is reported on a publicly accessible web page using a “traffic light” setup.

Creating the Network Monitor

  • Installation of Linux/Apache server software with distribution of Netsaint (now called Nagios), a network monitoring tool already being used at University of Tasmania.
  • CGI Front End uses integration with API for network monitoring tool
  • Primarily used by Helpdesk and General Student population.
  • Tool used for reporting services that are useful to students but pose no threat to security of IT infrastructure.
  • Site created using CSS and W3C standards for easier accessibility.
  • Url location: http://monitor.utas.edu.au (only accessible inside the firewall)

UTAS Network Monitor