private object SetupServiceConfig(InstanceContext instanceContext, Message message) { object obj2 = new CServiceConfig(); IServiceThreadPoolConfig config = (IServiceThreadPoolConfig)obj2; switch (this.info.ThreadingModel) { case ThreadingModel.MTA: config.SelectThreadPool(System.ServiceModel.ComIntegration.ThreadPoolOption.MTA); break; case ThreadingModel.STA: config.SelectThreadPool(System.ServiceModel.ComIntegration.ThreadPoolOption.STA); break; default: throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.UnexpectedThreadingModel()); } config.SetBindingInfo(System.ServiceModel.ComIntegration.BindingOption.BindingToPoolThread); if (this.info.HasUdts()) { IServiceSxsConfig config2 = obj2 as IServiceSxsConfig; if (config2 == null) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.QFENotPresent()); } lock (manifestLock) { string directory = string.Empty; try { directory = Path.GetTempPath(); } catch (Exception exception) { if (Fx.IsFatal(exception)) { throw; } throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.CannotAccessDirectory(directory)); } string path = directory + this.info.AppID.ToString() + @"\"; if (!Directory.Exists(path)) { try { Directory.CreateDirectory(path); } catch (Exception exception2) { if (Fx.IsFatal(exception2)) { throw; } throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.CannotAccessDirectory(path)); } Guid[] assemblies = this.info.Assemblies; ComIntegrationManifestGenerator.GenerateManifestCollectionFile(assemblies, path + manifestFileName + ".manifest", manifestFileName); foreach (Guid guid in assemblies) { System.Type[] types = this.info.GetTypes(guid); if (types.Length > 0) { string assemblyName = guid.ToString(); ComIntegrationManifestGenerator.GenerateWin32ManifestFile(types, path + assemblyName + ".manifest", assemblyName); } } } config2.SxsConfig(CSC_SxsConfig.CSC_NewSxs); config2.SxsName(manifestFileName + ".manifest"); config2.SxsDirectory(path); } } if (this.info.PartitionId != DefaultPartitionId) { IServicePartitionConfig config3 = (IServicePartitionConfig)obj2; config3.PartitionConfig(System.ServiceModel.ComIntegration.PartitionOption.New); config3.PartitionID(this.info.PartitionId); } IServiceTransactionConfig config4 = (IServiceTransactionConfig)obj2; config4.ConfigureTransaction(TransactionConfig.NoTransaction); if ((this.info.TransactionOption == TransactionOption.Required) || (this.info.TransactionOption == TransactionOption.Supported)) { Transaction messageTransaction = null; messageTransaction = MessageUtil.GetMessageTransaction(message); if (messageTransaction != null) { System.ServiceModel.ComIntegration.TransactionProxy item = new System.ServiceModel.ComIntegration.TransactionProxy(this.info.AppID, this.info.Clsid); item.SetTransaction(messageTransaction); instanceContext.Extensions.Add(item); IServiceSysTxnConfig config5 = (IServiceSysTxnConfig)config4; IntPtr pITxByot = TransactionProxyBuilder.CreateTransactionProxyTearOff(item); config5.ConfigureBYOTSysTxn(pITxByot); Marshal.Release(pITxByot); } } return(obj2); }
private object SetupServiceConfig(InstanceContext instanceContext, Message message) { object obj2 = new CServiceConfig(); IServiceThreadPoolConfig config = (IServiceThreadPoolConfig) obj2; switch (this.info.ThreadingModel) { case ThreadingModel.MTA: config.SelectThreadPool(System.ServiceModel.ComIntegration.ThreadPoolOption.MTA); break; case ThreadingModel.STA: config.SelectThreadPool(System.ServiceModel.ComIntegration.ThreadPoolOption.STA); break; default: throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.UnexpectedThreadingModel()); } config.SetBindingInfo(System.ServiceModel.ComIntegration.BindingOption.BindingToPoolThread); if (this.info.HasUdts()) { IServiceSxsConfig config2 = obj2 as IServiceSxsConfig; if (config2 == null) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.QFENotPresent()); } lock (manifestLock) { string directory = string.Empty; try { directory = Path.GetTempPath(); } catch (Exception exception) { if (Fx.IsFatal(exception)) { throw; } throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.CannotAccessDirectory(directory)); } string path = directory + this.info.AppID.ToString() + @"\"; if (!Directory.Exists(path)) { try { Directory.CreateDirectory(path); } catch (Exception exception2) { if (Fx.IsFatal(exception2)) { throw; } throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.CannotAccessDirectory(path)); } Guid[] assemblies = this.info.Assemblies; ComIntegrationManifestGenerator.GenerateManifestCollectionFile(assemblies, path + manifestFileName + ".manifest", manifestFileName); foreach (Guid guid in assemblies) { System.Type[] types = this.info.GetTypes(guid); if (types.Length > 0) { string assemblyName = guid.ToString(); ComIntegrationManifestGenerator.GenerateWin32ManifestFile(types, path + assemblyName + ".manifest", assemblyName); } } } config2.SxsConfig(CSC_SxsConfig.CSC_NewSxs); config2.SxsName(manifestFileName + ".manifest"); config2.SxsDirectory(path); } } if (this.info.PartitionId != DefaultPartitionId) { IServicePartitionConfig config3 = (IServicePartitionConfig) obj2; config3.PartitionConfig(System.ServiceModel.ComIntegration.PartitionOption.New); config3.PartitionID(this.info.PartitionId); } IServiceTransactionConfig config4 = (IServiceTransactionConfig) obj2; config4.ConfigureTransaction(TransactionConfig.NoTransaction); if ((this.info.TransactionOption == TransactionOption.Required) || (this.info.TransactionOption == TransactionOption.Supported)) { Transaction messageTransaction = null; messageTransaction = MessageUtil.GetMessageTransaction(message); if (messageTransaction != null) { System.ServiceModel.ComIntegration.TransactionProxy item = new System.ServiceModel.ComIntegration.TransactionProxy(this.info.AppID, this.info.Clsid); item.SetTransaction(messageTransaction); instanceContext.Extensions.Add(item); IServiceSysTxnConfig config5 = (IServiceSysTxnConfig) config4; IntPtr pITxByot = TransactionProxyBuilder.CreateTransactionProxyTearOff(item); config5.ConfigureBYOTSysTxn(pITxByot); Marshal.Release(pITxByot); } } return obj2; }
public object GetInstance(InstanceContext instanceContext, Message message) { object obj2 = null; Guid empty = Guid.Empty; if (ContextUtil.IsInTransaction) { empty = ContextUtil.TransactionId; } ComPlusInstanceCreationTrace.Trace(TraceEventType.Verbose, 0x50012, "TraceCodeComIntegrationInstanceCreationRequest", this.info, message, empty); WindowsIdentity messageIdentity = null; messageIdentity = MessageUtil.GetMessageIdentity(message); WindowsImpersonationContext context = null; try { try { if (this.info.HostingMode == HostingMode.WebHostOutOfProcess) { if (!System.ServiceModel.ComIntegration.SecurityUtils.IsAtleastImpersonationToken(new SafeCloseHandle(messageIdentity.Token, false))) { throw System.ServiceModel.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new COMException(System.ServiceModel.SR.GetString("BadImpersonationLevelForOutOfProcWas"), HR.ERROR_BAD_IMPERSONATION_LEVEL)); } context = messageIdentity.Impersonate(); } CLSCTX sERVER = CLSCTX.SERVER; if (PlatformSupportsBitness && (this.info.HostingMode == HostingMode.WebHostOutOfProcess)) { if (this.info.Bitness == Bitness.Bitness32) { sERVER |= CLSCTX.ACTIVATE_32_BIT_SERVER; } else { sERVER |= CLSCTX.ACTIVATE_64_BIT_SERVER; } } obj2 = System.ServiceModel.ComIntegration.SafeNativeMethods.CoCreateInstance(this.info.Clsid, null, sERVER, IID_IUnknown); } finally { if (context != null) { context.Undo(); } } } catch (Exception exception) { if (Fx.IsFatal(exception)) { throw; } Uri uri = null; if (message.Headers.From != null) { uri = message.Headers.From.Uri; } System.ServiceModel.DiagnosticUtility.EventLog.LogEvent(TraceEventType.Error, EventLogCategory.ComPlus, (EventLogEventId)(-1073610726), new string[] { (uri == null) ? string.Empty : uri.ToString(), this.info.AppID.ToString(), this.info.Clsid.ToString(), empty.ToString(), messageIdentity.Name, exception.ToString() }); throw TraceUtility.ThrowHelperError(exception, message); } System.ServiceModel.ComIntegration.TransactionProxy proxy = instanceContext.Extensions.Find <System.ServiceModel.ComIntegration.TransactionProxy>(); if (proxy != null) { proxy.InstanceID = obj2.GetHashCode(); } ComPlusInstanceCreationTrace.Trace(TraceEventType.Verbose, 0x50013, "TraceCodeComIntegrationInstanceCreationSuccess", this.info, message, obj2.GetHashCode(), empty); return(obj2); }