WS-Eventing implementation deployed!

I really like travelling because I can spend more time coding. So, last week while travelling in Germany and Italy for work, I found some time to finish the WS-Eventing implementation to which I referred in previous posts (post1, post2). I am guessing that there are going to be interoperability problems with existing implementations because I chose to use the current version of WS-Addressing (March 2004) rather the one that the current WS-Eventing specification uses (March 2003).

I have made the assembly with both the source and sink implementations available (http://wsgaf.ncl.ac.uk/services/eventing/wse.dll) if anyone wishes to use it (no documentation yet apart from blog posts... perhaps will work on the documentation later). I guess it's going to be more interesting testing interoperability with other implementations rather than downloading and using my assembly.

I have deployed a simple eventing service at http://wsgaf.ncl.ac.uk/services/eventing/eventing.ashx. You can use this endpoint as per the WS-Eventing specification minus two things for the moment: XPath support for the subscription filter and SOAP faults. When you subscribe your event sink with this service, you'll receive a notification message every 5 seconds with the time here in Newcastle. Yes, I know... not the most useful information out there 🙂

Here's the code for the simple program that raises this event (minus the "using" directives):

class Program

{

static void Main(string[] args)

{

Timer timer = newTimer(int.Parse(args[0]));

timer.Elapsed += newElapsedEventHandler(timerElapsed);

timer.Enabled = true;

Console .WriteLine("Press ENTER to exit.");

Console .ReadLine();

}

static void timerElapsed(object sender, System.Timers.ElapsedEventArgs e)

{

EventingSource .RaiseEvent(newTimeInNewcastle(), newUri("uk:ac:neresc:newcastletime:time"));

}

}

[XmlRoot(Namespace = "uk:ac:neresc:newcastletime")]

public class TimeInNewcastle

{

public DateTime Time = DateTime.Now;

}

}

The EventingSource.RaiseEvent will do the trick.

A simple sink client that will start receiving events and then will send an "unregister" message follows:

class Program

{

[STAThread]

static void Main(string[] args)

{

Uri sinkUri = newUri("soap.tcp://localhost:10001/sink");

Uri serviceUri = newUri("soap.tcp://localhost:10002/service");

SoapReceivers .Add(newEndpointReference(sinkUri), typeof(SinkSoapService));

SoapReceivers .Add(newEndpointReference(serviceUri), typeof(MySoapReceiver));

Subscription subscription = newSubscription(newUri("http://wsgaf.ncl.ac.uk/services/eventing/eventing.ashx"));

subscription.EndTo = new uk.ac.neresc.eventing.messages.Epr(sinkUri);

subscription.NotifyTo = new uk.ac.neresc.eventing.messages.Epr(serviceUri);

subscription.Lease.Duration = newTimeSpan(0, 0, 10);

// You can even add Refernece Properties if you want here

EventingSource .Register(subscription);

Console .WriteLine("Waiting for ENTER");

Console .ReadLine();

EventingSource .UnRegister(subscription);

Console .WriteLine("Waiting for ENTER");

Console .ReadLine();

}

class MySoapReceiver : SoapReceiver

{

public MySoapReceiver ()

{

}

protected override void Receive(SoapEnvelope envelope)

{

Console .WriteLine("Event received...");

envelope.Body.WriteTo(new System.Xml.XmlTextWriter(Console.Out));

}

}

}

Please feel free to send me comments/questions/complaints/requests etc.

2 responses to “WS-Eventing implementation deployed!”

  1. Jeremy Zacker
    Just asking if you could provide the SOAP Message (plain text) that this code sends out as the Subscription. I’ve been asked to provide a WS-Eventing implementation in Java. There are ZERO examples on the web. So I have to rely on the .NET geeks for now. But if it works it will be cool. WS-Eventing won’t be accepted in the market unless we can get some interoperability between different programming languages and platforms.