Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / cdf / src / NetFx35 / System.WorkflowServices / System / ServiceModel / Dispatcher / WorkflowOperationInvoker.cs / 1305376 / WorkflowOperationInvoker.cs
//------------------------------------------------------------ // Copyright (c) Microsoft Corporation. All rights reserved. //----------------------------------------------------------- namespace System.ServiceModel.Dispatcher { using System.Diagnostics; using System.Reflection; using System.Runtime; using System.Security; using System.ServiceModel.Channels; using System.ServiceModel.Description; using System.ServiceModel.Diagnostics; using System.Workflow.Runtime; class WorkflowOperationInvoker : IOperationInvoker { static object[] emptyObjectArray = new object[0]; bool canCreateInstance; DispatchRuntime dispatchRuntime; int inParameterCount; bool isOneWay; OperationDescription operationDescription; ServiceAuthorizationManager serviceAuthorizationManager; string staticQueueName; MethodInfo syncMethod; WorkflowInstanceLifetimeManagerExtension workflowInstanceLifeTimeManager; WorkflowRuntime workflowRuntime; public WorkflowOperationInvoker(OperationDescription operationDescription, WorkflowOperationBehavior workflowOperationBehavior, WorkflowRuntime workflowRuntime, DispatchRuntime dispatchRuntime) { if (operationDescription == null) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("operationDescription"); } if (workflowRuntime == null) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("workflowRuntime"); } if (workflowOperationBehavior == null) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("workflowOperationBehavior"); } this.isOneWay = operationDescription.IsOneWay; if (operationDescription.BeginMethod != null) { this.syncMethod = operationDescription.BeginMethod; inParameterCount = GetFlowedInParameterCount(operationDescription.BeginMethod.GetParameters()) - 2; } else { this.syncMethod = operationDescription.SyncMethod; inParameterCount = GetFlowedInParameterCount(operationDescription.SyncMethod.GetParameters()); } this.operationDescription = operationDescription; this.workflowRuntime = workflowRuntime; this.canCreateInstance = workflowOperationBehavior.CanCreateInstance; this.serviceAuthorizationManager = workflowOperationBehavior.ServiceAuthorizationManager; this.dispatchRuntime = dispatchRuntime; staticQueueName = QueueNameHelper.Create(this.syncMethod.DeclaringType, operationDescription.Name); } public bool CanCreateInstance { get { return this.canCreateInstance; } } public DispatchRuntime DispatchRuntime { get { return this.dispatchRuntime; } } public WorkflowInstanceLifetimeManagerExtension InstanceLifetimeManager { get { if (this.workflowInstanceLifeTimeManager == null) { this.workflowInstanceLifeTimeManager = this.dispatchRuntime.ChannelDispatcher.Host.Extensions.Find(); } return this.workflowInstanceLifeTimeManager; } } public bool IsOneWay { get { return this.isOneWay; } } public bool IsSynchronous { get { return false; } } public string StaticQueueName { get { return this.staticQueueName; } } public object[] AllocateInputs() { if (inParameterCount == 0) { return emptyObjectArray; } return new object[inParameterCount]; } public object Invoke(object instance, object[] inputs, out object[] outputs) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new NotImplementedException()); } public IAsyncResult InvokeBegin(object instance, object[] inputs, AsyncCallback callback, object state) { long beginTime = 0; if (PerformanceCounters.PerformanceCountersEnabled) { PerformanceCounters.MethodCalled(this.operationDescription.Name); try { if (UnsafeNativeMethods.QueryPerformanceCounter(out beginTime) == 0) { beginTime = -1; } } catch (SecurityException exception) { if (DiagnosticUtility.ShouldTraceWarning) { DiagnosticUtility.ExceptionUtility.TraceHandledException(exception, TraceEventType.Warning); } throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new SecurityException(SR.GetString("PartialTrustPerformanceCountersNotEnabled"), exception)); } } Authorize(); WorkflowDurableInstance durableInstance = (WorkflowDurableInstance) instance; Fx.Assert(durableInstance.CurrentOperationInvocation == null, "At the time WorkflowOperationInvoker.InvokeBegin is called, the WorkflowDurableInstance.CurrentOperationInvocation is expected to be null given the ConcurrencyMode.Single."); durableInstance.CurrentOperationInvocation = new WorkflowOperationAsyncResult( this, durableInstance, inputs, callback, state, beginTime); return durableInstance.CurrentOperationInvocation; } public object InvokeEnd(object instance, out object[] outputs, IAsyncResult result) { bool methodThrewException = false; if (result == null) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("result"); } WorkflowDurableInstance durableInstance = (WorkflowDurableInstance) instance; WorkflowOperationAsyncResult asyncResult = (WorkflowOperationAsyncResult) result; Fx.Assert(durableInstance.CurrentOperationInvocation != null, "At the time WorkflowOperationInvoker.InvokeEnd is called, the WorkflowDurableInstance.CurrentOperationInvocation is expected to be present."); try { return WorkflowOperationAsyncResult.End(asyncResult, out outputs); } catch (FaultException) { methodThrewException = true; if (PerformanceCounters.PerformanceCountersEnabled) { PerformanceCounters.MethodReturnedFault(this.operationDescription.Name); } throw; } catch (Exception e) { methodThrewException = true; if (Fx.IsFatal(e)) { throw; } if (PerformanceCounters.PerformanceCountersEnabled) { PerformanceCounters.MethodReturnedError(this.operationDescription.Name); } throw; } finally { durableInstance.CurrentOperationInvocation = null; if (!methodThrewException) { if (PerformanceCounters.PerformanceCountersEnabled) { long currentTime = 0; long duration = 0; if ((asyncResult.BeginTime >= 0) && (UnsafeNativeMethods.QueryPerformanceCounter(out currentTime) != 0)) { duration = currentTime - asyncResult.BeginTime; } PerformanceCounters.MethodReturnedSuccess(this.operationDescription.Name, duration); } } } } static int GetFlowedInParameterCount(System.Reflection.ParameterInfo[] parameterInfos) { int inputCount = 0; foreach (System.Reflection.ParameterInfo parameterInfo in parameterInfos) { if (parameterInfo.IsOut) { if (parameterInfo.IsIn) { ++inputCount; } } else { ++inputCount; } } return inputCount; } void Authorize() { Fx.Assert(OperationContext.Current != null, "Not in service dispatch thread"); if (this.serviceAuthorizationManager != null) { if (!this.serviceAuthorizationManager.CheckAccess(OperationContext.Current)) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(AuthorizationBehavior.CreateAccessDeniedFaultException()); } } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- EventLogPermissionEntryCollection.cs
- __ConsoleStream.cs
- GenericEnumConverter.cs
- ProviderConnectionPoint.cs
- TraceInternal.cs
- ApplyImportsAction.cs
- RectangleConverter.cs
- ControllableStoryboardAction.cs
- TransformerConfigurationWizardBase.cs
- EnvelopedSignatureTransform.cs
- DataControlCommands.cs
- PlacementWorkspace.cs
- ProfileModule.cs
- Effect.cs
- NonParentingControl.cs
- TypeSystem.cs
- SchemaElementDecl.cs
- StringCollection.cs
- BitmapCacheBrush.cs
- PermissionSet.cs
- DataGridViewComboBoxColumnDesigner.cs
- PrimitiveXmlSerializers.cs
- VectorAnimationBase.cs
- securitymgrsite.cs
- WebBrowserSiteBase.cs
- BamlRecordReader.cs
- AnimationTimeline.cs
- HttpListenerTimeoutManager.cs
- MouseActionConverter.cs
- OleServicesContext.cs
- ComponentSerializationService.cs
- FileLogRecordEnumerator.cs
- SelectionRangeConverter.cs
- ColorKeyFrameCollection.cs
- EditingCommands.cs
- FormClosingEvent.cs
- BitArray.cs
- LassoSelectionBehavior.cs
- PropertyReference.cs
- _AuthenticationState.cs
- URLAttribute.cs
- UserInitiatedRoutedEventPermissionAttribute.cs
- SourceFileBuildProvider.cs
- SqlDataSourceView.cs
- ResXBuildProvider.cs
- EntityRecordInfo.cs
- SingleTagSectionHandler.cs
- SslStream.cs
- SetStateEventArgs.cs
- TdsRecordBufferSetter.cs
- TextWriter.cs
- TemplateGroupCollection.cs
- CollectionDataContractAttribute.cs
- StateFinalizationDesigner.cs
- HtmlInputHidden.cs
- CTreeGenerator.cs
- SqlClientMetaDataCollectionNames.cs
- OracleConnectionStringBuilder.cs
- XamlPathDataSerializer.cs
- DataViewManager.cs
- StructuredProperty.cs
- SqlTriggerAttribute.cs
- MustUnderstandSoapException.cs
- RepeatInfo.cs
- ObjectDataSourceEventArgs.cs
- DecoderReplacementFallback.cs
- TraceUtility.cs
- AttachedPropertyBrowsableAttribute.cs
- GradientStop.cs
- ProxyOperationRuntime.cs
- TypedAsyncResult.cs
- MachineKeySection.cs
- FrameworkReadOnlyPropertyMetadata.cs
- DataKey.cs
- FlowDocumentPaginator.cs
- SimpleRecyclingCache.cs
- MULTI_QI.cs
- Util.cs
- WorkflowViewStateService.cs
- ResourceLoader.cs
- SmiSettersStream.cs
- NumberFormatInfo.cs
- PermissionSetTriple.cs
- SuppressIldasmAttribute.cs
- ExecutedRoutedEventArgs.cs
- DoubleAnimation.cs
- EmptyCollection.cs
- ValidationError.cs
- Int64KeyFrameCollection.cs
- DbCommandTree.cs
- FlowchartDesigner.xaml.cs
- WebBrowserNavigatedEventHandler.cs
- StringArrayConverter.cs
- ColumnHeaderConverter.cs
- Oci.cs
- NumberAction.cs
- QilValidationVisitor.cs
- ResourcePermissionBase.cs
- EntitySqlQueryCacheEntry.cs
- PagerSettings.cs