WorkflowRuntimeEndpoint.cs source code in C# .NET

Source code for the .NET framework in C#

                        

Code:

/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / cdf / src / NetFx35 / System.WorkflowServices / System / ServiceModel / Activities / Description / WorkflowRuntimeEndpoint.cs / 1305376 / WorkflowRuntimeEndpoint.cs

                            //---------------------------------------------------------------- 
// Copyright (c) Microsoft Corporation.  All rights reserved.
//---------------------------------------------------------------

namespace System.ServiceModel.Activities.Description 
{
    using System.Activities.Statements; 
    using System.Collections.ObjectModel; 
    using System.Diagnostics;
    using System.Globalization; 
    using System.Runtime;
    using System.ServiceModel.Channels;
    using System.ServiceModel.Description;
    using System.ServiceModel.Dispatcher; 
    using System.Runtime.DurableInstancing;
    using System.Collections.Generic; 
    using System.Threading; 
    using System.ServiceModel.Diagnostics;
    using System.Activities; 

    public class WorkflowRuntimeEndpoint : WorkflowHostingEndpoint
    {
        static readonly Uri baseUri = new Uri(string.Format(CultureInfo.InvariantCulture, "net.pipe://localhost/ExternalDataExchangeEndpoint/{0}/{1}", 
            Process.GetCurrentProcess().Id,
            AppDomain.CurrentDomain.Id)); 
 
        static int uriCounter = 0;
        internal static readonly Binding netNamedPipeContextBinding = new CustomBinding(new ContextBindingElement(), 
                new BinaryMessageEncodingBindingElement(),
                new NamedPipeTransportBindingElement()) { Name = "ExternalDataExchangeBinding" };

        WorkflowRuntimeServicesBehavior behavior; 

        internal const string ExternalDataExchangeNamespace = "http://wf.microsoft.com/externaldataexchange/"; 
        internal const string RaiseEventAction = "http://wf.microsoft.com/externaldataexchange/IExternalDataExchange/RaiseEvent"; 

        public WorkflowRuntimeEndpoint() 
            : base(typeof(IExternalDataExchange))
        {
            base.Binding = netNamedPipeContextBinding;
            string endpointUri = String.Format(CultureInfo.InvariantCulture, "{0}/{1}", baseUri, Interlocked.Increment(ref uriCounter)); 
            base.Address = new EndpointAddress(endpointUri);
            this.behavior = new WorkflowRuntimeServicesBehavior(); 
            this.Behaviors.Add(behavior); 
        }
 
        protected override Guid OnGetInstanceId(object[] inputs, OperationContext operationContext)
        {
            Fx.Assert(operationContext.IncomingMessageHeaders.Action == RaiseEventAction, "Message action is not RaiseEvent");
            Guid instanceId = Guid.Empty; 
            ContextMessageProperty contextMessageProperty;
            if (ContextMessageProperty.TryGet(operationContext.IncomingMessageProperties, out contextMessageProperty)) 
            { 
                string stringInstanceId = null;
                if (contextMessageProperty.Context.TryGetValue("instanceId", out stringInstanceId)) 
                {
                    Fx.TryCreateGuid(stringInstanceId, out instanceId);
                }
            } 

            return instanceId; 
        } 

        protected override Bookmark OnResolveBookmark(object[] inputs, OperationContext operationContext, WorkflowHostingResponseContext responseContext, out object value) 
        {
            Fx.Assert(operationContext.IncomingMessageHeaders.Action == RaiseEventAction, "Message action is not RaiseEvent");

            Fx.Assert(inputs.Length >= 3, "Insufficient number of inputs"); 

            Fx.Assert(inputs[1] is IComparable, "The queue name from ExternalDataExchangeService is not an IComparable object"); 
            IComparable queueName = (IComparable)inputs[1]; 

            value = inputs[2]; 
            responseContext.SendResponse(null, null);
            return new Bookmark(queueName.ToString());
        }
 
        public void AddService(object service)
        { 
            behavior.AddService(service); 
        }
 
        public void RemoveService(object service)
        {
            behavior.RemoveService(service);
        } 

        public object GetService(Type serviceType) 
        { 
            return behavior.GetService(serviceType);
        } 

        public T GetService()
        {
            return behavior.GetService(); 
        }
    } 
} 

// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
                        

Link Menu

Network programming in C#, Network Programming in VB.NET, Network Programming in .NET
This book is available now!
Buy at Amazon US or
Buy at Amazon UK