internal void GetParameterPropertyDescriptors(IDictionary properties) { if (properties == null) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("properties"); } if (((IComponent)this).Site == null) { return; } TypedOperationInfo serviceOperationInfo = this.ServiceOperationInfo; if (serviceOperationInfo != null) { MethodInfo methodInfo = serviceOperationInfo.GetMethodInfo(((IComponent)this).Site); if (methodInfo != null) { ArrayList paramInfo = new ArrayList(methodInfo.GetParameters()); if (!(methodInfo.ReturnType == typeof(void))) { paramInfo.Add(methodInfo.ReturnParameter); } foreach (ParameterInfo param in paramInfo) { if (param.ParameterType != null) { PropertyDescriptor prop = new ParameterInfoBasedPropertyDescriptor(typeof(ReceiveActivity), param, true, DesignOnlyAttribute.Yes); properties[prop.Name] = prop; } } } } }
protected internal override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext) { TypedOperationInfo serviceOperationInfo = this.ServiceOperationInfo; if (serviceOperationInfo == null) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError( new InvalidOperationException(SR2.GetString(SR2.Error_ServiceOperationInfoNotSpecified, this.Name))); } MethodInfo methodInfo = serviceOperationInfo.GetMethodInfo(executionContext); if (methodInfo == null) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError( new InvalidOperationException(SR2.GetString(SR2.Error_MethodInfoNotAvailable, this.Name))); } ChannelToken channelToken = this.ChannelToken; LogicalChannel logicalChannel = ChannelToken.Register(this, channelToken, serviceOperationInfo.ContractType); if (!logicalChannel.Initialized) { logicalChannel.Initialize(channelToken.EndpointName, this.CustomAddress); } using (ChannelManagerService.ChannelTicket leasedChannel = ChannelManagerService.Take(executionContext, this.WorkflowInstanceId, logicalChannel)) { using (OperationContextScope scope = new OperationContextScope((IContextChannel)leasedChannel.Channel)) { EventHandler <SendActivityEventArgs>[] invocationList = this.GetInvocationList <EventHandler <SendActivityEventArgs> >(SendActivity.BeforeSendEvent); if (invocationList != null && invocationList.Length > 0) { base.RaiseGenericEvent(SendActivity.BeforeSendEvent, this, new SendActivityEventArgs(this)); } SendOperationInfoHelper helper = this.OperationHelper; WorkflowParameterBindingCollection bindings = this.ParameterBindings; object[] parameters = helper.GetInputs(this, bindings); object returnValue = null; bool isSessionless = ChannelManagerHelpers.IsSessionlessContract(logicalChannel.ContractType); bool hasContext = (logicalChannel.Context != null && logicalChannel.Context.Count > 0); bool fatalException = false; if (!isSessionless && hasContext) { ChannelManagerService.ApplyLogicalChannelContext(logicalChannel); } try { returnValue = this.InvokeOperation(methodInfo, leasedChannel.Channel, parameters); } catch (Exception exception) { if (Fx.IsFatal(exception)) { fatalException = true; } throw; } finally { if (!fatalException && !hasContext && !isSessionless && !helper.IsOneWay) { ChannelManagerService.UpdateLogicalChannelContext(logicalChannel); } } helper.PopulateOutputs(this, bindings, parameters, returnValue); invocationList = this.GetInvocationList <EventHandler <SendActivityEventArgs> >(SendActivity.AfterResponseEvent); if (invocationList != null && invocationList.Length > 0) { base.RaiseGenericEvent(SendActivity.AfterResponseEvent, this, new SendActivityEventArgs(this)); } } } return(ActivityExecutionStatus.Closed); }