internal IDictionary<XName, ContractDescription> GetContractDescriptions() { if (this.cachedInferredContracts == null) { this.WalkActivityTree(); this.correlationQueryByContract = new Dictionary<XName, Collection<CorrelationQuery>>(); IDictionary<XName, ContractDescription> dictionary = new Dictionary<XName, ContractDescription>(); IDictionary<ContractAndOperationNameTuple, OperationInfo> dictionary2 = new Dictionary<ContractAndOperationNameTuple, OperationInfo>(); foreach (Receive receive in this.knownServiceActivities) { OperationInfo info; XName serviceContractXName = this.FixServiceContractName(receive.ServiceContractName); ContractAndOperationNameTuple key = new ContractAndOperationNameTuple(serviceContractXName, receive.OperationName); if (dictionary2.TryGetValue(key, out info)) { ContractValidationHelper.ValidateReceiveWithReceive(receive, info.Receive); } else { ContractDescription description; if (!dictionary.TryGetValue(serviceContractXName, out description)) { description = new ContractDescription(serviceContractXName.LocalName, serviceContractXName.NamespaceName) { ConfigurationName = serviceContractXName.LocalName }; dictionary.Add(serviceContractXName, description); } OperationDescription item = ContractInferenceHelper.CreateOperationDescription(receive, description); description.Operations.Add(item); info = new OperationInfo(receive, item); dictionary2.Add(key, info); } this.CorrectOutMessageForOperationWithFault(receive, info); ContractInferenceHelper.UpdateIsOneWayFlag(receive, info.OperationDescription); ContractInferenceHelper.AddFaultDescription(receive, info.OperationDescription); ContractInferenceHelper.AddKnownTypesToOperation(receive, info.OperationDescription); ContractInferenceHelper.AddReceiveToFormatterBehavior(receive, info.OperationDescription); Collection<CorrelationQuery> queries = null; if (receive.HasCorrelatesOn || receive.HasCorrelationInitializers) { MessageQuerySet select = receive.HasCorrelatesOn ? receive.CorrelatesOn : null; CorrelationQuery correlationQuery = ContractInferenceHelper.CreateServerCorrelationQuery(select, receive.CorrelationInitializers, info.OperationDescription, false); this.CollectCorrelationQuery(ref queries, serviceContractXName, correlationQuery); } if (receive.HasReply) { foreach (SendReply reply in receive.FollowingReplies) { ReceiveAndReplyTuple tuple2 = new ReceiveAndReplyTuple(receive, reply); this.receiveAndReplyPairs.Remove(tuple2); this.CollectCorrelationQueryFromReply(ref queries, serviceContractXName, reply, info.OperationDescription); reply.SetContractName(serviceContractXName); } } if (receive.HasFault) { foreach (Activity activity in receive.FollowingFaults) { ReceiveAndReplyTuple tuple3 = new ReceiveAndReplyTuple(receive, activity); this.receiveAndReplyPairs.Remove(tuple3); this.CollectCorrelationQueryFromReply(ref queries, serviceContractXName, activity, info.OperationDescription); } } } if (this.receiveAndReplyPairs.Count != 0) { throw System.ServiceModel.Activities.FxTrace.Exception.AsError(new ValidationException(System.ServiceModel.Activities.SR.DanglingReceive)); } if (System.ServiceModel.Activities.TD.InferredContractDescriptionIsEnabled()) { foreach (ContractDescription description3 in dictionary.Values) { System.ServiceModel.Activities.TD.InferredContractDescription(description3.Name, description3.Namespace); if (System.ServiceModel.Activities.TD.InferredOperationDescriptionIsEnabled()) { foreach (OperationDescription description4 in description3.Operations) { System.ServiceModel.Activities.TD.InferredOperationDescription(description4.Name, description3.Name, description4.IsOneWay.ToString()); } } } } this.cachedInferredContracts = dictionary; } return this.cachedInferredContracts; }
internal IDictionary <XName, ContractDescription> GetContractDescriptions() { if (this.cachedInferredContracts == null) { this.WalkActivityTree(); this.correlationQueryByContract = new Dictionary <XName, Collection <CorrelationQuery> >(); IDictionary <XName, ContractDescription> dictionary = new Dictionary <XName, ContractDescription>(); IDictionary <ContractAndOperationNameTuple, OperationInfo> dictionary2 = new Dictionary <ContractAndOperationNameTuple, OperationInfo>(); foreach (Receive receive in this.knownServiceActivities) { OperationInfo info; XName serviceContractXName = this.FixServiceContractName(receive.ServiceContractName); ContractAndOperationNameTuple key = new ContractAndOperationNameTuple(serviceContractXName, receive.OperationName); if (dictionary2.TryGetValue(key, out info)) { ContractValidationHelper.ValidateReceiveWithReceive(receive, info.Receive); } else { ContractDescription description; if (!dictionary.TryGetValue(serviceContractXName, out description)) { description = new ContractDescription(serviceContractXName.LocalName, serviceContractXName.NamespaceName) { ConfigurationName = serviceContractXName.LocalName }; dictionary.Add(serviceContractXName, description); } OperationDescription item = ContractInferenceHelper.CreateOperationDescription(receive, description); description.Operations.Add(item); info = new OperationInfo(receive, item); dictionary2.Add(key, info); } this.CorrectOutMessageForOperationWithFault(receive, info); ContractInferenceHelper.UpdateIsOneWayFlag(receive, info.OperationDescription); ContractInferenceHelper.AddFaultDescription(receive, info.OperationDescription); ContractInferenceHelper.AddKnownTypesToOperation(receive, info.OperationDescription); ContractInferenceHelper.AddReceiveToFormatterBehavior(receive, info.OperationDescription); Collection <CorrelationQuery> queries = null; if (receive.HasCorrelatesOn || receive.HasCorrelationInitializers) { MessageQuerySet select = receive.HasCorrelatesOn ? receive.CorrelatesOn : null; CorrelationQuery correlationQuery = ContractInferenceHelper.CreateServerCorrelationQuery(select, receive.CorrelationInitializers, info.OperationDescription, false); this.CollectCorrelationQuery(ref queries, serviceContractXName, correlationQuery); } if (receive.HasReply) { foreach (SendReply reply in receive.FollowingReplies) { ReceiveAndReplyTuple tuple2 = new ReceiveAndReplyTuple(receive, reply); this.receiveAndReplyPairs.Remove(tuple2); this.CollectCorrelationQueryFromReply(ref queries, serviceContractXName, reply, info.OperationDescription); reply.SetContractName(serviceContractXName); } } if (receive.HasFault) { foreach (Activity activity in receive.FollowingFaults) { ReceiveAndReplyTuple tuple3 = new ReceiveAndReplyTuple(receive, activity); this.receiveAndReplyPairs.Remove(tuple3); this.CollectCorrelationQueryFromReply(ref queries, serviceContractXName, activity, info.OperationDescription); } } } if (this.receiveAndReplyPairs.Count != 0) { throw System.ServiceModel.Activities.FxTrace.Exception.AsError(new ValidationException(System.ServiceModel.Activities.SR.DanglingReceive)); } if (System.ServiceModel.Activities.TD.InferredContractDescriptionIsEnabled()) { foreach (ContractDescription description3 in dictionary.Values) { System.ServiceModel.Activities.TD.InferredContractDescription(description3.Name, description3.Namespace); if (System.ServiceModel.Activities.TD.InferredOperationDescriptionIsEnabled()) { foreach (OperationDescription description4 in description3.Operations) { System.ServiceModel.Activities.TD.InferredOperationDescription(description4.Name, description3.Name, description4.IsOneWay.ToString()); } } } } this.cachedInferredContracts = dictionary; } return(this.cachedInferredContracts); }
private void WalkActivityTree() { if (this.knownServiceActivities == null) { if (this.Body == null) { throw System.ServiceModel.Activities.FxTrace.Exception.AsError(new ValidationException(System.ServiceModel.Activities.SR.MissingBodyInWorkflowService)); } WorkflowInspectionServices.CacheMetadata(this.Body); this.knownServiceActivities = new List<Receive>(); this.receiveAndReplyPairs = new HashSet<ReceiveAndReplyTuple>(); Queue<QueueItem> queue = new Queue<QueueItem>(); queue.Enqueue(new QueueItem(this.Body, null, null)); while (queue.Count > 0) { QueueItem item = queue.Dequeue(); Activity activity = item.Activity; TransactedReceiveScope parentTransactedReceiveScope = item.ParentTransactedReceiveScope; TransactedReceiveScope rootTransactedReceiveScope = item.RootTransactedReceiveScope; if (activity is Receive) { Receive receive = (Receive) activity; if (rootTransactedReceiveScope != null) { receive.InternalReceive.AdditionalData.IsInsideTransactedReceiveScope = true; if ((receive == parentTransactedReceiveScope.Request) && (parentTransactedReceiveScope == rootTransactedReceiveScope)) { receive.InternalReceive.AdditionalData.IsFirstReceiveOfTransactedReceiveScopeTree = true; } } this.knownServiceActivities.Add(receive); } else if (activity is SendReply) { SendReply reply = (SendReply) activity; Receive request = reply.Request; if (reply.InternalContent.IsFault) { request.FollowingFaults.Add(reply); } else { if (request.HasReply) { SendReply reply2 = request.FollowingReplies[0]; ContractValidationHelper.ValidateSendReplyWithSendReply(reply2, reply); } request.FollowingReplies.Add(reply); } ReceiveAndReplyTuple tuple = new ReceiveAndReplyTuple(request, reply); this.receiveAndReplyPairs.Add(tuple); } if (activity is TransactedReceiveScope) { parentTransactedReceiveScope = activity as TransactedReceiveScope; if (rootTransactedReceiveScope == null) { rootTransactedReceiveScope = parentTransactedReceiveScope; } } foreach (Activity activity2 in WorkflowInspectionServices.GetActivities(activity)) { QueueItem item2 = new QueueItem(activity2, parentTransactedReceiveScope, rootTransactedReceiveScope); queue.Enqueue(item2); } } } }
private void WalkActivityTree() { if (this.knownServiceActivities == null) { if (this.Body == null) { throw System.ServiceModel.Activities.FxTrace.Exception.AsError(new ValidationException(System.ServiceModel.Activities.SR.MissingBodyInWorkflowService)); } WorkflowInspectionServices.CacheMetadata(this.Body); this.knownServiceActivities = new List <Receive>(); this.receiveAndReplyPairs = new HashSet <ReceiveAndReplyTuple>(); Queue <QueueItem> queue = new Queue <QueueItem>(); queue.Enqueue(new QueueItem(this.Body, null, null)); while (queue.Count > 0) { QueueItem item = queue.Dequeue(); Activity activity = item.Activity; TransactedReceiveScope parentTransactedReceiveScope = item.ParentTransactedReceiveScope; TransactedReceiveScope rootTransactedReceiveScope = item.RootTransactedReceiveScope; if (activity is Receive) { Receive receive = (Receive)activity; if (rootTransactedReceiveScope != null) { receive.InternalReceive.AdditionalData.IsInsideTransactedReceiveScope = true; if ((receive == parentTransactedReceiveScope.Request) && (parentTransactedReceiveScope == rootTransactedReceiveScope)) { receive.InternalReceive.AdditionalData.IsFirstReceiveOfTransactedReceiveScopeTree = true; } } this.knownServiceActivities.Add(receive); } else if (activity is SendReply) { SendReply reply = (SendReply)activity; Receive request = reply.Request; if (reply.InternalContent.IsFault) { request.FollowingFaults.Add(reply); } else { if (request.HasReply) { SendReply reply2 = request.FollowingReplies[0]; ContractValidationHelper.ValidateSendReplyWithSendReply(reply2, reply); } request.FollowingReplies.Add(reply); } ReceiveAndReplyTuple tuple = new ReceiveAndReplyTuple(request, reply); this.receiveAndReplyPairs.Add(tuple); } if (activity is TransactedReceiveScope) { parentTransactedReceiveScope = activity as TransactedReceiveScope; if (rootTransactedReceiveScope == null) { rootTransactedReceiveScope = parentTransactedReceiveScope; } } foreach (Activity activity2 in WorkflowInspectionServices.GetActivities(activity)) { QueueItem item2 = new QueueItem(activity2, parentTransactedReceiveScope, rootTransactedReceiveScope); queue.Enqueue(item2); } } } }