Implementing Adapter Inbound Message Exchange Handler - Part 3 (Consumption in .NET Console Application using WCF Channel Model)

You saw in this post, how to test the inbound functionality of the WCF-based adapter using the WCF Service Model. 

If you are interested in testing the Adapter Inbound Handler using the WCF Channel Model, the following sample shows you how to do so. This bypasses the de-serialization of the WCF messages that happens in the WCF Service Model.

1) Create a new Visual Studio C# Console Application Project

 

2) Modify Program.cs

We will not use the app.config in this sample. In this case, the channel listener is invoked using the raw WCF Channel Model programming model. Note how the binding parameter collection is used in this case to pass the action to the inbound handler StartListener() method. The WCF channel model lets you work with the XML directly without having to go through the Dispatcher and run into serialization/de-serialization issues.

using System;

using System.Collections.Generic;

using System.Text;

using System.Xml;

// WCF Namespace

using System.ServiceModel;

using System.ServiceModel.Channels;

// Adapter SDK Namespace

using Microsoft.ServiceModel.Channels;

// HelloWorldAdapter Namespace

using Microsoft.WCF.Samples.Adapters;

namespace TestHelloWorldAdapter_InboundScenario

{

    class Program

    {

        static void Main(string[] args)

        {

            IChannelListener<IInputChannel> listener = null;

            IInputChannel channel = null;

            try

            {

                string baseUri = "hello://";

                // Create the adapter binding

                HelloWorldAdapterBinding binding = new HelloWorldAdapterBinding();

                binding.Inbound_FileFilter = "*.txt";

                binding.Inbound_FileWatcherPath = @"c:\temp\helloworld";

                // Create a binding parameter collection with a list of SOAP actions to listen on

   AdapterInboundActionCollection actions = new AdapterInboundActionCollection(new Uri(baseUri));

                actions.Add("Hello/OnReceiveGreeting");

                BindingParameterCollection bpcol = new BindingParameterCollection();

                bpcol.Add(actions);

                // Use the Binding and Binding Parameter Collection to build the channel listener

                listener = binding.BuildChannelListener<IInputChannel>(new Uri(baseUri), bpcol);

                // Listen for messages

                listener.Open();

                // Wait for and accept incoming connections

                bool havechannel = listener.WaitForChannel(TimeSpan.FromMinutes(1));

                channel = listener.AcceptChannel();

            // Open the accepted channel

                channel.Open();

                // Wait for and receive a message from the channel

                Console.WriteLine("Copy a file with extension " + binding.Inbound_FileFilter + " into " + binding.Inbound_FileWatcherPath);

                Console.WriteLine("Wait for and receive a message from the channel...");

                Console.WriteLine("\nPress CTRL+C to terminate.\n");

                Message message = null;

                while (true)

                {

                    try

                    {

                        bool status = channel.TryReceive(TimeSpan.FromMinutes(2), out message);

                        // Read the message

                        if (message != null)

                        {

                            // Display the request message content

                            XmlReader requestReader = message.GetReaderAtBodyContents();

                            Console.WriteLine(requestReader.ReadOuterXml());

                            Console.WriteLine();

                            Console.WriteLine(requestReader.ReadString());

                            Console.WriteLine();

                            // Do not forget to close the message

                            message.Close();

                        }

                    }

                    catch(System.Xml.XmlException xmlEx)

                    {

                        Console.WriteLine(xmlEx);

                        break;

                    }

                }

            }

            catch (CommunicationException ex)

            {

                Console.WriteLine(ex.Message);

            }

            finally

            {

                // Do not forget to close the channel

                channel.Close();

                // Do not forget to close the listener

                listener.Close();

            }

        }

    }

}

 

1) Build and Run

Once the build is successful, you should be able to see a Console Window popup.

2) Test

Copy a file with extension *.txt into c:\temp\helloworld

Wait for and receive a message from the channel...

Press CTRL+C to terminate.

<OnReceiveGreeting xmlns="hello://Microsoft.WCF.Samples.Adapters"><name>c:\temp\helloworld\lang.txt</name><data>Salut, Hallo, Hey, Moin Moin, Hola, Bonjour, Bon Soir, Bonne Nuit, Ciao, Hej, Hoi, Namaste!</data></OnReceiveGreeting>

<OnReceiveGreeting xmlns="hello://Microsoft.WCF.Samples.Adapters"><name>c:\temp\helloworld\hello.txt</name><data>Hello Hello ..</data></OnReceiveGreeting>

 

Copy a *.txt file into the file watcher folder – make this folder an adapter binding property, so it can be set via app.config.

The service is listening for the messages coming from the adapter and the messages are created when the event is triggered by the File System Watcher. I copied two text files into the watcher folder and the above output was created, based on the service implementation.

Next time: Testing adapter inbound handler implementation in BizTalk Server 2006 R2 using BizTalk WCF Adapter and Consume Adapter Service BizTalk Project Add-In