Beispiel #1
0
        static CorrelationQuery CreateCorrelationQueryCore(MessageQuerySet select, Collection <CorrelationInitializer> correlationInitializers)
        {
            CorrelationQuery correlationQuery = null;

            if (select != null)
            {
                Fx.Assert(select.Count != 0, "Empty MessageQuerySet is not allowed!");

                correlationQuery = new CorrelationQuery
                {
                    Select = select
                };
            }

            if (correlationInitializers != null && correlationInitializers.Count > 0)
            {
                foreach (CorrelationInitializer correlation in correlationInitializers)
                {
                    QueryCorrelationInitializer queryCorrelation = correlation as QueryCorrelationInitializer;
                    if (queryCorrelation != null)
                    {
                        Fx.Assert(queryCorrelation.MessageQuerySet.Count != 0, "Empty MessageQuerySet is not allowed!");

                        correlationQuery = correlationQuery ?? new CorrelationQuery();
                        correlationQuery.SelectAdditional.Add(queryCorrelation.MessageQuerySet);
                    }
                }
            }

            return(correlationQuery);
        }
        static CorrelationQuery CreateDefaultCorrelationQuery(CorrelationQuery query, string action, CorrelationDataDescription data, ref bool shouldPreserveMessage)
        {
            MessageQuery messageQuery = new XPathMessageQuery
            {
                Expression = string.Format(CultureInfo.InvariantCulture, defaultQueryFormat, data.Name),
                Namespaces = new XPathMessageContext()
            };

            if (data.IsOptional)
            {
                messageQuery = new OptionalMessageQuery
                {
                    Query = messageQuery
                };
            }


            if (query == null)
            {
                MessageFilter filter;
                // verify if the data name is added by the context channel
                bool isContextQuery = (data.Name == contextCorrelationName);

                // if there is a query that is not a context query set it to true since we might read from
                // the message body
                if (!shouldPreserveMessage && !isContextQuery)
                {
                    shouldPreserveMessage = true;
                }
                // this is a server side query, we use an action filter
                if (action == MessageHeaders.WildcardAction)
                {
                    filter = new MatchAllMessageFilter();
                }
                else
                {
                    filter = new ActionMessageFilter(action);
                }

                return(new CorrelationQuery
                {
                    Where = filter,

                    IsDefaultContextQuery = isContextQuery,

                    Select = new MessageQuerySet
                    {
                        { data.Name, messageQuery }
                    }
                });
            }
            else
            {
                query.Select[data.Name] = messageQuery;
                return(query);
            }
        }
Beispiel #3
0
        private void CollectCorrelationQueryFromReply(ref Collection <CorrelationQuery> correlationQueries, XName serviceContractName, Activity reply, OperationDescription operation)
        {
            SendReply reply2 = reply as SendReply;

            if (reply2 != null)
            {
                CorrelationQuery correlationQuery = ContractInferenceHelper.CreateServerCorrelationQuery(null, reply2.CorrelationInitializers, operation, true);
                this.CollectCorrelationQuery(ref correlationQueries, serviceContractName, correlationQuery);
            }
        }
 private void CollectCorrelationQuery(ref Collection<CorrelationQuery> queries, XName serviceContractName, CorrelationQuery correlationQuery)
 {
     if (correlationQuery != null)
     {
         if ((queries == null) && !this.correlationQueryByContract.TryGetValue(serviceContractName, out queries))
         {
             queries = new Collection<CorrelationQuery>();
             this.correlationQueryByContract.Add(serviceContractName, queries);
         }
         queries.Add(correlationQuery);
     }
 }
        public static CorrelationQuery CreateServerCorrelationQuery(MessageQuerySet select, Collection <CorrelationInitializer> correlationInitializers, OperationDescription operation, bool isResponse)
        {
            CorrelationQuery query = CreateCorrelationQueryCore(select, correlationInitializers);

            if (query != null)
            {
                string str = !isResponse ? operation.Messages[0].Action : operation.Messages[1].Action;
                CorrelationActionMessageFilter filter = new CorrelationActionMessageFilter {
                    Action = str
                };
                query.Where = filter;
            }
            return(query);
        }
 internal void SetReplyCorrelationQuery(CorrelationQuery replyQuery)
 {
     if ((this.internalSend != null) && !this.internalSend.ReplyCorrelationQueries.Contains(replyQuery))
     {
         this.internalSend.ReplyCorrelationQueries.Add(replyQuery);
     }
     else
     {
         if (this.lazyCorrelationQueries == null)
         {
             this.lazyCorrelationQueries = new List <CorrelationQuery>();
         }
         this.lazyCorrelationQueries.Add(replyQuery);
     }
 }
Beispiel #7
0
        public static CorrelationQuery CreateServerCorrelationQuery(MessageQuerySet select, Collection <CorrelationInitializer> correlationInitializers,
                                                                    OperationDescription operation, bool isResponse)
        {
            Fx.Assert(operation != null, "Argument cannot be null!");

            CorrelationQuery correlationQuery = CreateCorrelationQueryCore(select, correlationInitializers);

            if (correlationQuery != null)
            {
                string action = !isResponse ? operation.Messages[0].Action : operation.Messages[1].Action;
                correlationQuery.Where = new CorrelationActionMessageFilter {
                    Action = action
                };
            }

            return(correlationQuery);
        }
        internal void SetReplyCorrelationQuery(CorrelationQuery replyQuery)
        {
            Fx.Assert(replyQuery != null, "replyQuery cannot be null!");

            if (this.internalSend != null && !this.internalSend.ReplyCorrelationQueries.Contains(replyQuery))
            {
                this.internalSend.ReplyCorrelationQueries.Add(replyQuery);
            }
            else
            {
                // we save the CorrelationQuery and add it to InternalSendMessage later
                if (this.lazyCorrelationQueries == null)
                {
                    this.lazyCorrelationQueries = new List <CorrelationQuery>();
                }
                this.lazyCorrelationQueries.Add(replyQuery);
            }
        }
Beispiel #9
0
        private static CorrelationQuery CreateDefaultCorrelationQuery(CorrelationQuery query, string action, CorrelationDataDescription data, ref bool shouldPreserveMessage)
        {
            XPathMessageQuery query5 = new XPathMessageQuery {
                Expression = string.Format(CultureInfo.InvariantCulture, "sm:correlation-data('{0}')", new object[] { data.Name }),
                Namespaces = new XPathMessageContext()
            };
            MessageQuery query2 = query5;

            if (data.IsOptional)
            {
                OptionalMessageQuery query3 = new OptionalMessageQuery {
                    Query = query2
                };
                query2 = query3;
            }
            if (query == null)
            {
                MessageFilter filter;
                bool          flag = data.Name == "wsc-instanceId";
                if (!shouldPreserveMessage && !flag)
                {
                    shouldPreserveMessage = true;
                }
                if (action == "*")
                {
                    filter = new MatchAllMessageFilter();
                }
                else
                {
                    filter = new ActionMessageFilter(new string[] { action });
                }
                CorrelationQuery query4 = new CorrelationQuery {
                    Where = filter,
                    IsDefaultContextQuery = flag
                };
                MessageQuerySet set = new MessageQuerySet();
                set.Add(data.Name, query2);
                query4.Select = set;
                return(query4);
            }
            query.Select[data.Name] = query2;
            return(query);
        }
Beispiel #10
0
        // this method generates the correlationQuery for client side send and receiveReply
        public static Collection <CorrelationQuery> CreateClientCorrelationQueries(MessageQuerySet select, Collection <CorrelationInitializer> correlationInitializers,
                                                                                   string overridingAction, XName serviceContractName, string operationName, bool isResponse)
        {
            Fx.Assert(serviceContractName != null && operationName != null, "Argument cannot be null!");

            Collection <CorrelationQuery> queryCollection = new Collection <CorrelationQuery>();
            CorrelationQuery correlationQuery             = CreateCorrelationQueryCore(select, correlationInitializers);

            if (correlationQuery != null)
            {
                if (overridingAction != null)
                {
                    correlationQuery.Where = new CorrelationActionMessageFilter {
                        Action = overridingAction
                    };
                }
                else
                {
                    ProvideDefaultNamespace(ref serviceContractName);
                    string defaultAction = NamingHelper.GetMessageAction(new XmlQualifiedName(serviceContractName.LocalName, serviceContractName.NamespaceName),
                                                                         operationName, null, isResponse);

                    correlationQuery.Where = new CorrelationActionMessageFilter {
                        Action = defaultAction
                    };
                }

                queryCollection.Add(correlationQuery);

                if (isResponse)
                {
                    // we need an additional query with empty action to support soap1.1 reply cases
                    CorrelationQuery noActionQuery = correlationQuery.Clone();
                    noActionQuery.Where = new CorrelationActionMessageFilter {
                        Action = String.Empty
                    };
                    queryCollection.Add(noActionQuery);
                }
            }

            return(queryCollection);
        }
        private static CorrelationQuery CreateCorrelationQueryCore(MessageQuerySet select, Collection <CorrelationInitializer> correlationInitializers)
        {
            CorrelationQuery query = null;

            if (select != null)
            {
                query = new CorrelationQuery {
                    Select = select
                };
            }
            if ((correlationInitializers != null) && (correlationInitializers.Count > 0))
            {
                foreach (CorrelationInitializer initializer in correlationInitializers)
                {
                    QueryCorrelationInitializer initializer2 = initializer as QueryCorrelationInitializer;
                    if (initializer2 != null)
                    {
                        query = query ?? new CorrelationQuery();
                        query.SelectAdditional.Add(initializer2.MessageQuerySet);
                    }
                }
            }
            return(query);
        }
        public static Collection <CorrelationQuery> CreateClientCorrelationQueries(MessageQuerySet select, Collection <CorrelationInitializer> correlationInitializers, string overridingAction, XName serviceContractName, string operationName, bool isResponse)
        {
            Collection <CorrelationQuery> collection = new Collection <CorrelationQuery>();
            CorrelationQuery item = CreateCorrelationQueryCore(select, correlationInitializers);

            if (item != null)
            {
                if (overridingAction != null)
                {
                    CorrelationActionMessageFilter filter = new CorrelationActionMessageFilter {
                        Action = overridingAction
                    };
                    item.Where = filter;
                }
                else
                {
                    ProvideDefaultNamespace(ref serviceContractName);
                    string str = NamingHelper.GetMessageAction(new XmlQualifiedName(serviceContractName.LocalName, serviceContractName.NamespaceName), operationName, null, isResponse);
                    CorrelationActionMessageFilter filter2 = new CorrelationActionMessageFilter {
                        Action = str
                    };
                    item.Where = filter2;
                }
                collection.Add(item);
                if (isResponse)
                {
                    CorrelationQuery query2 = item.Clone();
                    CorrelationActionMessageFilter filter3 = new CorrelationActionMessageFilter {
                        Action = string.Empty
                    };
                    query2.Where = filter3;
                    collection.Add(query2);
                }
            }
            return(collection);
        }
        static CorrelationQuery CreateCorrelationQueryCore(MessageQuerySet select, Collection<CorrelationInitializer> correlationInitializers)
        {
            CorrelationQuery correlationQuery = null;

            if (select != null)
            {
                Fx.Assert(select.Count != 0, "Empty MessageQuerySet is not allowed!");

                correlationQuery = new CorrelationQuery
                {
                    Select = select
                };
            }

            if (correlationInitializers != null && correlationInitializers.Count > 0)
            {
                foreach (CorrelationInitializer correlation in correlationInitializers)
                {
                    QueryCorrelationInitializer queryCorrelation = correlation as QueryCorrelationInitializer;
                    if (queryCorrelation != null)
                    {
                        Fx.Assert(queryCorrelation.MessageQuerySet.Count != 0, "Empty MessageQuerySet is not allowed!");

                        correlationQuery = correlationQuery ?? new CorrelationQuery();
                        correlationQuery.SelectAdditional.Add(queryCorrelation.MessageQuerySet);
                    }
                }
            }

            return correlationQuery;
        }
        void ConfigureBindingDefaultQueries(ServiceEndpoint endpoint, ICorrelationDataSource source, bool dispatch)
        {
            if (!CorrelationQuery.IsQueryCollectionSearchable(this.queries))
            {
                return;
            }

            // we should preserve the message if there are any existing queries added by the user
            if (this.queries.Count <= 0)
            {
                this.shouldPreserveMessage = false;
            }

            foreach (OperationDescription operation in endpoint.Contract.Operations)
            {
                string           inAction;
                CorrelationQuery inQuery;
                string           outAction          = null;
                CorrelationQuery outQuery           = null;
                CorrelationQuery noActionReplyQuery = null;

                inAction = operation.Messages[0].Action;
                inQuery  = CorrelationQuery.FindCorrelationQueryForAction(this.queries, inAction);

                if (!operation.IsOneWay)
                {
                    outAction = operation.Messages[1].Action;
                    outQuery  = CorrelationQuery.FindCorrelationQueryForAction(this.queries, outAction);
                    if (!dispatch)
                    {
                        noActionReplyQuery = CorrelationQuery.FindCorrelationQueryForAction(this.queries, String.Empty);
                    }
                }

                // we will not add default query if a query already exists for the action
                bool canDefaultIn  = inQuery == null;
                bool canDefaultOut = !operation.IsOneWay && outQuery == null;

                // if there are no user added queries for receiveReply, we add a NoActionQuery
                bool addNoActionQueryForReply = !operation.IsOneWay && !dispatch && noActionReplyQuery == null;

                // On the client side we add special filters, SendFilter and ReceiveFilter
                // But on dispatch side, we use ActionFilter and therefore need to verify that for wildcardaction, we
                // only add a single defaultquery
                if (canDefaultIn && canDefaultOut)
                {
                    //verify if any of them is a wildcardaction, in that case let's just add a single query with a MatchAllFilter
                    if (inAction == MessageHeaders.WildcardAction)
                    {
                        canDefaultOut = false;
                    }
                    else if (outAction == MessageHeaders.WildcardAction)
                    {
                        canDefaultIn = false;
                    }
                    else if (inAction == outAction)
                    {
                        // in this case we will be adding the same query twice, let's just add once
                        // a possible scenario is when we add a contractDescription with wildcardaction for request & reply
                        canDefaultOut = false;
                    }
                }

                if (!canDefaultIn && !canDefaultOut)
                {
                    continue;
                }

                foreach (CorrelationDataDescription data in source.DataSources)
                {
                    if (!data.IsDefault)
                    {
                        continue;
                    }

                    if (canDefaultIn &&
                        (dispatch && data.ReceiveValue || data.SendValue))
                    {
                        inQuery = CreateDefaultCorrelationQuery(inQuery, inAction, data, ref shouldPreserveMessage);
                    }

                    if (canDefaultOut &&
                        (dispatch && data.SendValue || data.ReceiveValue))
                    {
                        outQuery = CreateDefaultCorrelationQuery(outQuery, outAction, data, ref shouldPreserveMessage);
                    }

                    if (addNoActionQueryForReply)
                    {
                        noActionReplyQuery = CreateDefaultCorrelationQuery(noActionReplyQuery, String.Empty, data, ref shouldPreserveMessage);
                    }
                }

                if (canDefaultIn && inQuery != null)
                {
                    this.queries.Add(inQuery);
                }

                if (canDefaultOut && outQuery != null)
                {
                    this.queries.Add(outQuery);
                }

                if (addNoActionQueryForReply && noActionReplyQuery != null)
                {
                    this.queries.Add(noActionReplyQuery);
                }
            }
        }
Beispiel #15
0
 private void ConfigureBindingDefaultQueries(ServiceEndpoint endpoint, ICorrelationDataSource source, bool dispatch)
 {
     if (CorrelationQuery.IsQueryCollectionSearchable(this.queries))
     {
         if (this.queries.Count <= 0)
         {
             this.shouldPreserveMessage = false;
         }
         foreach (OperationDescription description in endpoint.Contract.Operations)
         {
             string           action = null;
             CorrelationQuery query2 = null;
             CorrelationQuery query3 = null;
             string           str    = description.Messages[0].Action;
             CorrelationQuery query  = CorrelationQuery.FindCorrelationQueryForAction(this.queries, str);
             if (!description.IsOneWay)
             {
                 action = description.Messages[1].Action;
                 query2 = CorrelationQuery.FindCorrelationQueryForAction(this.queries, action);
                 if (!dispatch)
                 {
                     query3 = CorrelationQuery.FindCorrelationQueryForAction(this.queries, string.Empty);
                 }
             }
             bool flag  = query == null;
             bool flag2 = !description.IsOneWay && (query2 == null);
             bool flag3 = (!description.IsOneWay && !dispatch) && (query3 == null);
             if (flag && flag2)
             {
                 if (str == "*")
                 {
                     flag2 = false;
                 }
                 else if (action == "*")
                 {
                     flag = false;
                 }
                 else if (str == action)
                 {
                     flag2 = false;
                 }
             }
             if (flag || flag2)
             {
                 foreach (CorrelationDataDescription description2 in source.DataSources)
                 {
                     if (description2.IsDefault)
                     {
                         if (flag && ((dispatch && description2.ReceiveValue) || description2.SendValue))
                         {
                             query = CreateDefaultCorrelationQuery(query, str, description2, ref this.shouldPreserveMessage);
                         }
                         if (flag2 && ((dispatch && description2.SendValue) || description2.ReceiveValue))
                         {
                             query2 = CreateDefaultCorrelationQuery(query2, action, description2, ref this.shouldPreserveMessage);
                         }
                         if (flag3)
                         {
                             query3 = CreateDefaultCorrelationQuery(query3, string.Empty, description2, ref this.shouldPreserveMessage);
                         }
                     }
                 }
                 if (flag && (query != null))
                 {
                     this.queries.Add(query);
                 }
                 if (flag2 && (query2 != null))
                 {
                     this.queries.Add(query2);
                 }
                 if (flag3 && (query3 != null))
                 {
                     this.queries.Add(query3);
                 }
             }
         }
     }
 }
 internal void SetReplyCorrelationQuery(CorrelationQuery replyQuery)
 {
     if ((this.internalSend != null) && !this.internalSend.ReplyCorrelationQueries.Contains(replyQuery))
     {
         this.internalSend.ReplyCorrelationQueries.Add(replyQuery);
     }
     else
     {
         if (this.lazyCorrelationQueries == null)
         {
             this.lazyCorrelationQueries = new List<CorrelationQuery>();
         }
         this.lazyCorrelationQueries.Add(replyQuery);
     }
 }
Beispiel #17
0
        internal void SetReplyCorrelationQuery(CorrelationQuery replyQuery)
        {
            Fx.Assert(replyQuery != null, "replyQuery cannot be null!");

            if (this.internalSend != null && !this.internalSend.ReplyCorrelationQueries.Contains(replyQuery))
            {
                this.internalSend.ReplyCorrelationQueries.Add(replyQuery);
            }
            else
            {
                // we save the CorrelationQuery and add it to InternalSendMessage later
                if (this.lazyCorrelationQueries == null)
                {
                    this.lazyCorrelationQueries = new List<CorrelationQuery>();
                }
                this.lazyCorrelationQueries.Add(replyQuery);
            }
        }
Beispiel #18
0
 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);
 }
Beispiel #19
0
 private void CollectCorrelationQuery(ref Collection <CorrelationQuery> queries, XName serviceContractName, CorrelationQuery correlationQuery)
 {
     if (correlationQuery != null)
     {
         if ((queries == null) && !this.correlationQueryByContract.TryGetValue(serviceContractName, out queries))
         {
             queries = new Collection <CorrelationQuery>();
             this.correlationQueryByContract.Add(serviceContractName, queries);
         }
         queries.Add(correlationQuery);
     }
 }
 private static CorrelationQuery CreateCorrelationQueryCore(MessageQuerySet select, Collection<CorrelationInitializer> correlationInitializers)
 {
     CorrelationQuery query = null;
     if (select != null)
     {
         query = new CorrelationQuery {
             Select = select
         };
     }
     if ((correlationInitializers != null) && (correlationInitializers.Count > 0))
     {
         foreach (CorrelationInitializer initializer in correlationInitializers)
         {
             QueryCorrelationInitializer initializer2 = initializer as QueryCorrelationInitializer;
             if (initializer2 != null)
             {
                 query = query ?? new CorrelationQuery();
                 query.SelectAdditional.Add(initializer2.MessageQuerySet);
             }
         }
     }
     return query;
 }