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); }
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); }
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> }
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> }
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); }
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)); }
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); }
/// <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; } }