Exemplo n.º 1
0
        public void InstanceWithSingletonMode()
        {
            SingletonService instance = new SingletonService();
            ServiceHost      host     = new ServiceHost(instance);

            Assert.IsNotNull(host.Description.Behaviors.Find <ServiceBehaviorAttribute> ().GetWellKnownSingleton(), "#1");
            host.AddServiceEndpoint(
                typeof(SingletonService),
                new BasicHttpBinding(),
                new Uri("http://localhost:37564/s2"));

            // in case Open() didn't fail, we need to close the host.
            // And even if Close() caused the expected exception,
            // the test should still fail.
            try {
                host.Open();
                ChannelDispatcher cd = (ChannelDispatcher)host.ChannelDispatchers [0];
                DispatchRuntime   dr = cd.Endpoints [0].DispatchRuntime;
                Assert.IsNotNull(dr.InstanceContextProvider, "#2");
                InstanceContext ctx = dr.InstanceContextProvider.GetExistingInstanceContext(null, null);
                Assert.IsNotNull(ctx, "#3");
                Assert.AreEqual(instance, ctx.GetServiceInstance(), "#4");
            } finally {
                if (host.State == CommunicationState.Opened)
                {
                    host.Close();
                }
            }
        }
        public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
        {
            var instance = instanceContext.GetServiceInstance(request);

            if (instance is IProvideMessageSession sessionProvider)
            {
                sessionProvider.Session = messageSession;
            }
            return(null);
        }
Exemplo n.º 3
0
        static void Main(string[] args)
        {
            //ServiceHostManager manager = new ServiceHostManager();
            //manager.Run();

            ServiceHostBootstrapper bootstrapper = new ServiceHostBootstrapper();

            bootstrapper.Run();

            DatabaseInitializer.Initialize();

            //ServiceHostManager manager = bootstrapper._container.GetExportedValue<IServiceHostManager>() as ServiceHostManager;

            IServiceLocator    serviceLocator = bootstrapper._container.GetExportedValue <IServiceLocator>();
            ServiceHostManager manager        = serviceLocator.GetInstance <IServiceHostManager>() as ServiceHostManager;

            manager._container = bootstrapper._container;
            manager.LookupServices();

            int basePort = 50000;

            foreach (var host in manager.Services)
            {
                if (!host.UpdateAddressPort(basePort))
                {
                    Console.WriteLine("Hosting Service: " + host.Meta.Name + " UpdateAddressPort " + basePort.ToString() + " failure.");
                }

                //foreach (var address in service.Description.Endpoints)
                //{
                //    Console.WriteLine("Hosting Service: " + service.Meta.Name + " at " + address.Address.Uri);
                //}

                Debug.Assert(host.Description.Endpoints.Count == 1);

                host.Open();

                OperationContext operationContext = OperationContext.Current;
                InstanceContext  instanceContext  = operationContext.InstanceContext;
                ILighterService  service          = instanceContext.GetServiceInstance() as ILighterService;
                service.Initialize();

                var address = host.Description.Endpoints[0];
                Console.WriteLine("Hosting Service: " + host.Meta.Name + " at " + address.Address.Uri);

                //basePort++;
            }

            Console.ReadKey();

            foreach (var service in manager.Services)
            {
                service.Close();
            }
        }
        public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
        {
            NHibernate.ISession Database = NhibernateBootStrapper.GetSession();
            try
            {
                string header = OperationContext.Current.IncomingMessageHeaders.GetHeader <string>("application-name", "http://aspensys.com/");

                // auth hack - daquinohd
                // ServiceSecurityContext.PrimaryIdentity.Name is not returning a value, so I'm
                // using System.Security.Principal.WindowsIdentity.GetCurrent().Name to get the AppPool Identity for now.
                string name = OperationContext.Current.ServiceSecurityContext.PrimaryIdentity.Name;
                name = System.Security.Principal.WindowsIdentity.GetCurrent().Name;

                UnauthorizedAccessException uae = new UnauthorizedAccessException(string.Format("{0} cannot access the application {1}", name, header));
                if (!OperationContext.Current.ServiceSecurityContext.PrimaryIdentity.IsAuthenticated)
                {
                    FaultException faultException = new FaultException(string.Format("{0} cannot access the application {1}, it is unauthenticated", name, header));
                }
                Account account = Database.Query <Account>().FirstOrDefault <Account>((Account acc) => acc.Username.ToLower() == name.ToLower());
                if (account == null)
                {
                    throw new FaultException(string.Format("{0} cannot access the application {1}, it does not have acces to GUAM", name, header));
                }
                IQueryable <Application> app_auth =
                    from app in Database.Query <Application>()
                    join acc in Database.Query <ApplicationAccount>() on app.ApplicationID equals acc.Application.ApplicationID
                    where acc.Account.AccountID == account.AccountID
                    select app;
                if ((account.Admin ? false : !app_auth.Any <Application>()))
                {
                    throw uae;
                }
                GlobalUsersService instance = instanceContext.GetServiceInstance() as GlobalUsersService;
                if (instance != null)
                {
                    instance.CurrentApplication = (
                        from a in Database.Query <Application>()
                        where a.ApplicationName.ToLower() == header.ToLower()
                        select a).FirstOrDefault <Application>();
                    if (instance.CurrentApplication == null)
                    {
                        throw new Exception(string.Concat("Application '", header, "' not found in database."));
                    }
                }
            }
            finally
            {
                if (Database != null)
                {
                    Database.Dispose();
                }
            }
            return(null);
        }
Exemplo n.º 5
0
        public static void Snippet10()
        {
            // <Snippet10>
            Uri baseAddress = new Uri("http://localhost:8000/ServiceModelSamples/service");

            // Create a ServiceHost for the CalculatorService type and provide the base address.
            using (ServiceHost serviceHost = new ServiceHost(typeof(CalculatorService), baseAddress))
            {
                serviceHost.Open();
                OperationContext  operationContext = OperationContext.Current;
                InstanceContext   instanceContext  = operationContext.InstanceContext;
                CalculatorService service          = (CalculatorService)instanceContext.GetServiceInstance();
            }
            // </Snippet10>
        }
Exemplo n.º 6
0
        public static void Snippet11()
        {
            Message msg = Message.CreateMessage(MessageVersion.Default, "SomeAction");
            // <Snippet11>
            Uri baseAddress = new Uri("http://localhost:8000/ServiceModelSamples/service");

            // Create a ServiceHost for the CalculatorService type and provide the base address.
            using (ServiceHost serviceHost = new ServiceHost(typeof(CalculatorService), baseAddress))
            {
                serviceHost.Open();
                OperationContext  operationContext = OperationContext.Current;
                InstanceContext   instanceContext  = operationContext.InstanceContext;
                CalculatorService service          = (CalculatorService)instanceContext.GetServiceInstance(msg);
            }
            // </Snippet11>
        }
Exemplo n.º 7
0
        public object AfterReceiveRequest(ref System.ServiceModel.Channels.Message request, IClientChannel channel, InstanceContext instanceContext)
        {
            Console.WriteLine("Service....Received");
            //Debug.Write(request.ToString());

            var action = OperationContext.Current.IncomingMessageHeaders.Action;
            var name   = instanceContext.GetServiceInstance().GetType().Name;

            if (action != null)
            {
                var operationName = action.Substring(action.LastIndexOf("/", StringComparison.OrdinalIgnoreCase) + 1);
                File.AppendAllText(@"D:\rootdirectory\log.txt", operationName);
            }


            return(null);
        }
Exemplo n.º 8
0
        private static ServerInterceptorContext InitializeContextWithHeaders(Message request, InstanceContext instanceContext)
        {
            var peer = (request.Properties[RemoteEndpointMessageProperty.Name] is RemoteEndpointMessageProperty remoteEndpoint) ?
                       $"{remoteEndpoint.Address}:{remoteEndpoint.Port}" : "<unknown>";

            var host = Dns.GetHostName();

            var instance      = instanceContext?.GetServiceInstance();
            var instanceName  = (instance != null) ? instance.GetType().FullName : string.Empty;
            var action        = request.Headers.Action;
            var operationName = !string.IsNullOrEmpty(action) ?
                                action.Substring(action.LastIndexOf("/", StringComparison.OrdinalIgnoreCase) + 1) : "*";
            var method = $"{instanceName}.{operationName}";

            var requestHeaders = request.Headers.Extract();

            return(new ServerInterceptorContext(peer, method, host, requestHeaders));
        }
Exemplo n.º 9
0
        public object BeforeInvoke(InstanceContext instanceContext, IClientChannel channel, Message message)
        {
            ComPlusServerSecurity       serverSecurity = null;
            WindowsImpersonationContext context        = null;
            object           obj3;
            bool             flag               = false;
            WindowsIdentity  clientIdentity     = null;
            Uri              from               = null;
            int              instanceID         = 0;
            string           action             = null;
            TransactionProxy proxy              = null;
            Transaction      messageTransaction = null;
            Guid             empty              = Guid.Empty;

            try
            {
                try
                {
                    clientIdentity = MessageUtil.GetMessageIdentity(message);
                    if (message.Headers.From != null)
                    {
                        from = message.Headers.From.Uri;
                    }
                    instanceID = instanceContext.GetServiceInstance(message).GetHashCode();
                    action     = message.Headers.Action;
                    ComPlusMethodCallTrace.Trace(TraceEventType.Verbose, 0x50018, "TraceCodeComIntegrationInvokingMethod", this.info, from, action, clientIdentity.Name, this.iid, instanceID, false);
                    if (this.info.CheckRoles && !this.comAuth.IsAuthorizedForOperation(clientIdentity))
                    {
                        throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.CallAccessDenied());
                    }
                    if (this.info.HostingMode != HostingMode.WebHostOutOfProcess)
                    {
                        serverSecurity = new ComPlusServerSecurity(clientIdentity, this.info.CheckRoles);
                    }
                    proxy = instanceContext.Extensions.Find <TransactionProxy>();
                    if (proxy != null)
                    {
                        messageTransaction = MessageUtil.GetMessageTransaction(message);
                        if (messageTransaction != null)
                        {
                            empty = messageTransaction.TransactionInformation.DistributedIdentifier;
                        }
                        try
                        {
                            if (messageTransaction == null)
                            {
                                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.TransactionMismatch());
                            }
                            proxy.SetTransaction(messageTransaction);
                            ComPlusMethodCallTrace.Trace(TraceEventType.Verbose, 0x5001a, "TraceCodeComIntegrationInvokingMethodNewTransaction", this.info, from, action, clientIdentity.Name, this.iid, instanceID, empty);
                            goto Label_02DC;
                        }
                        catch (FaultException exception)
                        {
                            Transaction currentTransaction    = proxy.CurrentTransaction;
                            Guid        distributedIdentifier = Guid.Empty;
                            if (currentTransaction != null)
                            {
                                distributedIdentifier = currentTransaction.TransactionInformation.DistributedIdentifier;
                            }
                            string name = string.Empty;
                            if (clientIdentity != null)
                            {
                                name = clientIdentity.Name;
                            }
                            DiagnosticUtility.EventLog.LogEvent(TraceEventType.Error, EventLogCategory.ComPlus, (EventLogEventId)(-1073610725), new string[] { empty.ToString("B").ToUpperInvariant(), distributedIdentifier.ToString("B").ToUpperInvariant(), from.ToString(), this.info.AppID.ToString("B").ToUpperInvariant(), this.info.Clsid.ToString("B").ToUpperInvariant(), this.iid.ToString(), action, instanceID.ToString(CultureInfo.InvariantCulture), Thread.CurrentThread.ManagedThreadId.ToString(CultureInfo.InvariantCulture), System.ServiceModel.ComIntegration.SafeNativeMethods.GetCurrentThreadId().ToString(CultureInfo.InvariantCulture), name, exception.ToString() });
                            flag = true;
                            throw;
                        }
                    }
                    ComPlusMethodCallTrace.Trace(TraceEventType.Verbose, 0x5001b, "TraceCodeComIntegrationInvokingMethodContextTransaction", this.info, from, action, clientIdentity.Name, this.iid, instanceID, true);
Label_02DC:
                    if (this.info.HostingMode == HostingMode.WebHostOutOfProcess)
                    {
                        context = clientIdentity.Impersonate();
                    }
                    CorrelationState state = new CorrelationState(context, serverSecurity, from, action, clientIdentity.Name, instanceID);
                    context        = null;
                    serverSecurity = null;
                    obj3           = state;
                }
                finally
                {
                    if (context != null)
                    {
                        context.Undo();
                    }
                    if (serverSecurity != null)
                    {
                        ((IDisposable)serverSecurity).Dispose();
                    }
                }
            }
            catch (Exception exception2)
            {
                if (!flag && DiagnosticUtility.ShouldTraceError)
                {
                    DiagnosticUtility.EventLog.LogEvent(TraceEventType.Error, EventLogCategory.ComPlus, (EventLogEventId)(-1073610727), new string[] { (from == null) ? string.Empty : from.ToString(), this.info.AppID.ToString("B").ToUpperInvariant(), this.info.Clsid.ToString("B").ToUpperInvariant(), this.iid.ToString("B").ToUpperInvariant(), action, instanceID.ToString(CultureInfo.InvariantCulture), Thread.CurrentThread.ManagedThreadId.ToString(CultureInfo.InvariantCulture), System.ServiceModel.ComIntegration.SafeNativeMethods.GetCurrentThreadId().ToString(CultureInfo.InvariantCulture), clientIdentity.Name, exception2.ToString() });
                }
                throw;
            }
            return(obj3);
        }
Exemplo n.º 10
0
 /// <summary>
 /// Gets the service instance.
 /// </summary>
 /// <returns>object.</returns>
 public object GetServiceInstance()
 {
     return(_context.GetServiceInstance());
 }
        public object BeforeInvoke(
            InstanceContext instanceContext,
            IClientChannel channel,
            Message message)
        {
            ComPlusServerSecurity       serverSecurity     = null;
            WindowsImpersonationContext impersonateContext = null;
            bool             errorTraced           = false;
            WindowsIdentity  identity              = null;
            Uri              from                  = null;
            object           instance              = null;
            int              instanceID            = 0;
            string           action                = null;
            TransactionProxy proxy                 = null;
            Transaction      tx                    = null;
            Guid             incomingTransactionID = Guid.Empty;

            // The outer try block is to comply with FXCOP's WrapVulnerableFinallyClausesInOuterTry rule.
            try
            {
                try
                {
                    identity = MessageUtil.GetMessageIdentity(message);

                    if (message.Headers.From != null)
                    {
                        from = message.Headers.From.Uri;
                    }

                    instance   = instanceContext.GetServiceInstance(message);
                    instanceID = instance.GetHashCode();
                    action     = message.Headers.Action;



                    ComPlusMethodCallTrace.Trace(TraceEventType.Verbose, TraceCode.ComIntegrationInvokingMethod,
                                                 SR.TraceCodeComIntegrationInvokingMethod, this.info, from, action, identity.Name, iid, instanceID, false);

                    // Security
                    //

                    if (this.info.CheckRoles)
                    {
                        if (!this.comAuth.IsAuthorizedForOperation(identity))
                        {
                            throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.CallAccessDenied());
                        }
                    }

                    if (this.info.HostingMode != HostingMode.WebHostOutOfProcess)
                    {
                        // NOTE: This has the side effect of setting up
                        //       the COM server security thing, so be sure
                        //       to clear it with Dispose() eventually.
                        //
                        serverSecurity = new ComPlusServerSecurity(identity,
                                                                   this.info.CheckRoles);
                    }

                    // Transactions
                    //
                    proxy = instanceContext.Extensions.Find <TransactionProxy>();
                    if (proxy != null)
                    {
                        // This makes the Tx header Understood.
                        tx = MessageUtil.GetMessageTransaction(message);
                        if (tx != null)
                        {
                            incomingTransactionID = tx.TransactionInformation.DistributedIdentifier;
                        }
                        try
                        {
                            if (tx != null)
                            {
                                proxy.SetTransaction(tx);
                            }
                            else
                            {
                                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.TransactionMismatch());
                            }
                            ComPlusMethodCallTrace.Trace(TraceEventType.Verbose, TraceCode.ComIntegrationInvokingMethodNewTransaction,
                                                         SR.TraceCodeComIntegrationInvokingMethodNewTransaction, this.info, from, action, identity.Name, iid, instanceID, incomingTransactionID);
                        }
                        catch (FaultException e)
                        {
                            Transaction txProxy = proxy.CurrentTransaction;
                            Guid        currentTransactionID = Guid.Empty;
                            if (txProxy != null)
                            {
                                currentTransactionID = txProxy.TransactionInformation.DistributedIdentifier;
                            }

                            string identityName = String.Empty;

                            if (null != identity)
                            {
                                identityName = identity.Name;
                            }

                            DiagnosticUtility.EventLog.LogEvent(TraceEventType.Error,
                                                                (ushort)System.Runtime.Diagnostics.EventLogCategory.ComPlus,
                                                                (uint)System.Runtime.Diagnostics.EventLogEventId.ComPlusInvokingMethodFailedMismatchedTransactions,
                                                                incomingTransactionID.ToString("B").ToUpperInvariant(),
                                                                currentTransactionID.ToString("B").ToUpperInvariant(),
                                                                from.ToString(),
                                                                this.info.AppID.ToString("B").ToUpperInvariant(),
                                                                this.info.Clsid.ToString("B").ToUpperInvariant(),
                                                                iid.ToString(),
                                                                action,
                                                                instanceID.ToString(CultureInfo.InvariantCulture),
                                                                System.Threading.Thread.CurrentThread.ManagedThreadId.ToString(CultureInfo.InvariantCulture),
                                                                SafeNativeMethods.GetCurrentThreadId().ToString(CultureInfo.InvariantCulture),
                                                                identityName,
                                                                e.ToString());
                            errorTraced = true;
                            throw;
                        }
                    }
                    else
                    {
                        ComPlusMethodCallTrace.Trace(TraceEventType.Verbose, TraceCode.ComIntegrationInvokingMethodContextTransaction,
                                                     SR.TraceCodeComIntegrationInvokingMethodContextTransaction, this.info, from, action, identity.Name, iid, instanceID, true);
                    }

                    // Impersonation
                    //
                    if (this.info.HostingMode == HostingMode.WebHostOutOfProcess)
                    {
                        impersonateContext = identity.Impersonate();
                    }

                    CorrelationState correlationState;
                    correlationState = new CorrelationState(impersonateContext,
                                                            serverSecurity,
                                                            from,
                                                            action,
                                                            identity.Name,
                                                            instanceID);

                    impersonateContext = null;
                    serverSecurity     = null;


                    return(correlationState);
                }
                finally
                {
                    if (impersonateContext != null)
                    {
                        impersonateContext.Undo();
                    }

                    if (serverSecurity != null)
                    {
                        ((IDisposable)serverSecurity).Dispose();
                    }
                }
            }
            catch (Exception e)
            {
                if (errorTraced == false)
                {
                    if (DiagnosticUtility.ShouldTraceError)
                    {
                        DiagnosticUtility.EventLog.LogEvent(TraceEventType.Error,
                                                            (ushort)System.Runtime.Diagnostics.EventLogCategory.ComPlus,
                                                            (uint)System.Runtime.Diagnostics.EventLogEventId.ComPlusInvokingMethodFailed,
                                                            from == null ? string.Empty : from.ToString(),
                                                            this.info.AppID.ToString("B").ToUpperInvariant(),
                                                            this.info.Clsid.ToString("B").ToUpperInvariant(),
                                                            iid.ToString("B").ToUpperInvariant(),
                                                            action,
                                                            instanceID.ToString(CultureInfo.InvariantCulture),
                                                            System.Threading.Thread.CurrentThread.ManagedThreadId.ToString(CultureInfo.InvariantCulture),
                                                            SafeNativeMethods.GetCurrentThreadId().ToString(CultureInfo.InvariantCulture),
                                                            identity.Name,
                                                            e.ToString());
                    }
                }
                throw;
            }
        }