MessageQuery Class
Defines the core behavior of classes used to search for specific correlating data in a message.
Assembly: System.ServiceModel (in System.ServiceModel.dll)
The MessageQuery type exposes the following members.
| Name | Description | |
|---|---|---|
![]() | CreateMessageQueryCollection | Creates a collection of queries that returns a specific type of data associated with it. |
![]() | Equals(Object) | Determines whether the specified Object is equal to the current Object. (Inherited from Object.) |
![]() | Evaluate(Of TResult)(Message) | When overridden in a derived class, runs a query against the message and returns a result. The body cannot be queried. |
![]() | Evaluate(Of TResult)(MessageBuffer) | When overridden in a derived class, runs a query against the message and returns a result. |
![]() | Finalize | Allows an object to try to free resources and perform other cleanup operations before it is reclaimed by garbage collection. (Inherited from Object.) |
![]() | GetHashCode | Serves as a hash function for a particular type. (Inherited from Object.) |
![]() | GetType | Gets the Type of the current instance. (Inherited from Object.) |
![]() | MemberwiseClone | Creates a shallow copy of the current Object. (Inherited from Object.) |
![]() | ToString | Returns a string that represents the current object. (Inherited from Object.) |
The MessageQuery class is similar to the MessageFilter class. However, instead of returning matches, the Evaluate method returns the results of evaluating a query against a message. The result of the query is a value in the message. Use the value as a key to correlate the message to other messages. To add a new property for the data, use the Add(String, Func(Of String)) method of the CorrelationDataMessageProperty class.
Note |
|---|
For a concrete implementation of the MessageQuery, see the XPathMessageQuery class. |
Using the XPathMessageQuery and MessageQueryCollection classes
You can optimize the query process by creating a set of query objects and inserting them into an instance of the MessageQueryCollection class.
Note |
|---|
For a concrete implementation of the MessageQueryCollection, see the XPathMessageQueryCollection class. |
A common usage is to populate the collection with queries that have the same XPath predicate, but that differ only in the final leaf value. For example, the following XPath queries are identical except for the final clause. The first queries for all elements that have the quantity attribute set to 1, and the second queries for elements with the product attribute set to 'Contoso'):
"/s12:Envelope/s12:Body/PurchaseOrder/Items/Item[@quantity = 1]" "/s12:Envelope/s12:Body/PurchaseOrder/Items/Item[@product = 'Contoso']"
The MessageQueryCollection class allows you to create tables of queries that differ only slightly, enabling more efficient processing.
Alternatively, you can use the MessageQueryTable(Of TItem) class to store and evaluate message queries.
The following example creates a message and XPath message queries. The queries are evaluated by the XPathMessageQuery objects contained in an XPathMessageQueryCollection object. The results of each query are tested using the ResultType property of the XPathResult class.
Imports System.IO Imports System.Xml Imports System.ServiceModel.Dispatcher Imports System.ServiceModel Imports System.ServiceModel.Channels Imports System.Xml.XPath Namespace MessageQueryExamples Public Class Program Public Shared Sub Main(ByVal args As String()) ' The XPathMessageQueryCollection inherits from MessageQueryCollection. Dim queryCollection As XPathMessageQueryCollection = MessageHelper.SetupQueryCollection() ' Create a message and a copy of the message. You must create a buffered copy to access the message body. Dim mess As Message = MessageHelper.CreateMessage() Dim mb As MessageBuffer = mess.CreateBufferedCopy(Integer.MaxValue) ' Evaluate every query in the collection. Dim q As XPathMessageQuery For Each q In queryCollection ' Evaluate the query. Note the result type is an XPathResult. Dim qPathResult As XPathResult = q.Evaluate(Of XPathResult)(mb) ' Use the XPathResult to determine the result type. Console.WriteLine("Result type: {0}", qPathResult.ResultType) ' The following code prints the result according to the result type. If qPathResult.ResultType = XPathResultType.String Then Console.WriteLine("{0} = {1}", q.Expression, qPathResult.GetResultAsString()) End If If (qPathResult.ResultType = XPathResultType.NodeSet) Then ' Iterate through the node set. Dim ns As XPathNodeIterator = qPathResult.GetResultAsNodeset() Dim n As XPathNavigator For Each n In ns Console.WriteLine(" {0} = {1}", q.Expression, n.Value) Next End If If qPathResult.ResultType = XPathResultType.Number Then Console.WriteLine(" {0} = {1}", q.Expression, qPathResult.GetResultAsNumber()) End If If qPathResult.ResultType = XPathResultType.Boolean Then Console.WriteLine(" {0} ={1}", q.Expression, qPathResult.GetResultAsBoolean()) End If If qPathResult.ResultType = XPathResultType.Error Then Console.WriteLine(" Error!") End If Next Console.WriteLine() ' The alternate code below demonstrates similar funcionality using a MessageQueryTable. ' The difference is the KeyValuePair that requires a key to index each value. ' The code uses the expression as the key, and an arbitrary value for the value. 'Dim mq As MessageQueryTable(Of String) = MessageHelper.SetupTable() 'Dim kv As KeyValuePair(Of MessageQuery, String) 'For Each kv In mq ' ' ' Dim xp As XPathMessageQuery = CType(kv.Key, XPathMessageQuery) ' Console.WriteLine("Value = {0}", kv.Value) ' Console.WriteLine("{0} = {1}", xp.Expression, xp.Evaluate(Of String)(mb)) 'Next Console.ReadLine() End Sub Private Shared Sub Evaluate(ByVal p1 As Object) Throw New NotImplementedException End Sub End Class Public Class MessageHelper Shared messageBody As String = _ "<PurchaseOrder date='today'>" + _ "<Number>ABC-2009-XYZ</Number>" + _ "<Department>OnlineSales</Department>" + _ "<Items>" + _ "<Item product='nail' quantity='1'>item1</Item>" + _ "<Item product='screw' quantity='2'>item2</Item>" + _ "<Item product='brad' quantity='3'>" + _ "<SpecialOffer/>" + _ "Special item4" + _ "</Item>" + _ "<Item product='SpecialNails' quantity='9'>item5</Item>" + _ "<Item product='SpecialBrads' quantity='11'>" + _ "<SpecialOffer/>" + _ "Special item6" + _ "</Item>" + _ "<Item product='hammer' quantity='1'>item7</Item>" + _ "<Item product='wrench' quantity='2'>item8</Item>" + _ "</Items>" + _ "<Comments>" + _ "Rush order" + _ "</Comments>" + _ "</PurchaseOrder>" Public Shared xpath As String = "/s12:Envelope/s12:Body/PurchaseOrder/Items/Item[@quantity = 1]" Public Shared xpath2 As String = "/s12:Envelope/s12:Body/PurchaseOrder/Items/Item[@product = 'nail']" Public Shared xpath3 As String = "/s12:Envelope/s12:Body/PurchaseOrder/Comments" Public Shared xpath4 As String = "count(/s12:Envelope/s12:Body/PurchaseOrder/Items/Item)" Public Shared xpath5 As String = "substring(string(/s12:Envelope/s12:Body/PurchaseOrder/Number),5,4)" Public Shared xpath6 As String = "/s12:Envelope/s12:Body/PurchaseOrder/Department='OnlineSales'" Public Shared xpath7 As String = "//PurchaseOrder/@date" Public Shared xpath8 As String = "//SpecialOffer/ancestor::Item[@product = 'brad']" ' Invoke the correlation data function. Public Shared xpath9 As String = "sm:correlation-data('CorrelationData1')" Public Shared xpath10 As String = "sm:correlation-data('CorrelationData2')" Public Shared xpath11 As String = "/s12:Envelope/s12:Body/PurchaseOrder/Items/Item[@quantity = 2]" Public Shared Function CreateMessage() As Message Dim stringReader As New StringReader(messageBody) Dim xmlReader As New XmlTextReader(stringReader) Dim message As Message = message.CreateMessage( _ MessageVersion.Soap12WSAddressing10, "http://purchaseorder", xmlReader) ' Add two correlation properties using lambda expressions. The property names are ' CorrelationData1 and CorrelationData2. The first goes to "value1" and the ' second to "value2". You can use your own property names and values. Dim data As New CorrelationDataMessageProperty() data.Add("CorrelationData1", Function() "value1") data.Add("CorrelationData2", Function() "value2") message.Properties(CorrelationDataMessageProperty.Name) = data Return message End Function Public Shared Function SetupQueryCollection() As XPathMessageQueryCollection ' Create the query collection and add the XPath queries to it. To create ' the query, you must also use a new XPathMessageContext. Dim queryCollection As New XPathMessageQueryCollection() Dim context As XPathMessageContext = New XPathMessageContext() queryCollection.Add(New XPathMessageQuery(xpath, context)) queryCollection.Add(New XPathMessageQuery(xpath2, context)) queryCollection.Add(New XPathMessageQuery(xpath3, context)) queryCollection.Add(New XPathMessageQuery(xpath4, context)) queryCollection.Add(New XPathMessageQuery(xpath5, context)) queryCollection.Add(New XPathMessageQuery(xpath6, context)) queryCollection.Add(New XPathMessageQuery(xpath7, context)) queryCollection.Add(New XPathMessageQuery(xpath8, context)) queryCollection.Add(New XPathMessageQuery(xpath9, context)) queryCollection.Add(New XPathMessageQuery(xpath10, context)) queryCollection.Add(New XPathMessageQuery(xpath11, context)) Return queryCollection End Function Public Shared Function SetupTable() As MessageQueryTable(Of String) ' This is optional code to demonstrate using a MessageQueryTable. ' Compare this to the MessageQueryCollection. Dim table As MessageQueryTable(Of String) = New MessageQueryTable(Of String)() Dim context As XPathMessageContext = New XPathMessageContext() ' The code adds a KeyValuePair to the table. Each pair requires ' a query used as the Key, and a value that is paired to the key. table.Add(New XPathMessageQuery(xpath, context), "value10") table.Add(New XPathMessageQuery(xpath2, context), "value20") table.Add(New XPathMessageQuery(xpath3, context), "value30") table.Add(New XPathMessageQuery(xpath4, context), "value40") table.Add(New XPathMessageQuery(xpath5, context), "value50") table.Add(New XPathMessageQuery(xpath6, context), "value60") table.Add(New XPathMessageQuery(xpath7, context), "value70") table.Add(New XPathMessageQuery(xpath8, context), "value80") table.Add(New XPathMessageQuery(xpath9, context), "value90") table.Add(New XPathMessageQuery(xpath10, context), "value100") table.Add(New XPathMessageQuery(xpath11, context), "value110") Return table End Function End Class End Namespace
Windows 7, Windows Vista SP1 or later, Windows XP SP3, Windows Server 2008 (Server Core not supported), Windows Server 2008 R2 (Server Core supported with SP1 or later), Windows Server 2003 SP2
The .NET Framework does not support all versions of every platform. For a list of the supported versions, see .NET Framework System Requirements.


Note