MessageQuery Klasse

Definition

Definiert das Kernverhalten von Klassen, das verwendet wurde, um in einer Nachricht nach bestimmten korrelierenden Daten zu suchen.Defines the core behavior of classes used to search for specific correlating data in a message.

public ref class MessageQuery abstract
public abstract class MessageQuery
type MessageQuery = class
Public MustInherit Class MessageQuery
Vererbung
MessageQuery
Abgeleitet

Beispiele

Im folgenden Beispiel werden eine neue Meldung und XPath-Meldungsabfragen erstellt.The following example creates a message and XPath message queries. Die Abfragen werden von den XPathMessageQuery-Objekten ausgewertet, die in einem XPathMessageQueryCollection-Objekt enthalten sind.The queries are evaluated by the XPathMessageQuery objects contained in an XPathMessageQueryCollection object. Die Ergebnisse einer jeden Abfrage werden mit der ResultType-Eigenschaft der XPathResult-Klasse getestet.The results of each query are tested using the ResultType property of the XPathResult class.

using System;
using System.IO;
using System.Xml;
using System.ServiceModel.Dispatcher;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.Xml.XPath;

namespace MessageQueryExamples
{
    
    class Program
    {
        static void Main(string[] args)
        {
            // The XPathMessageQueryCollection inherits from MessageQueryCollection.
            XPathMessageQueryCollection queryCollection = MessageHelper.SetupQueryCollection();

            // Create a message and a copy of the message. You must create a buffered copy to access the message body.
            Message mess = MessageHelper.CreateMessage();
            MessageBuffer mb = mess.CreateBufferedCopy(int.MaxValue);

            // Evaluate every query in the collection. 
            foreach (XPathMessageQuery q in queryCollection)
            {
                // Evaluate the query. Note the result type is an XPathResult.
                XPathResult qPathResult = q.Evaluate<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)
                    Console.WriteLine("{0} = {1}", q.Expression, qPathResult.GetResultAsString());

                if (qPathResult.ResultType == XPathResultType.NodeSet)
                {
                    // Iterate through the node set.
                    XPathNodeIterator ns = qPathResult.GetResultAsNodeset();
                    foreach (XPathNavigator n in ns)
                        Console.WriteLine("\t{0} = {1}", q.Expression, n.Value);
                }
                if (qPathResult.ResultType == XPathResultType.Number)
                    Console.WriteLine("\t{0} = {1}", q.Expression, qPathResult.GetResultAsNumber());

                if (qPathResult.ResultType == XPathResultType.Boolean)
                    Console.WriteLine("\t{0} ={1}", q.Expression, qPathResult.GetResultAsBoolean());

                if (qPathResult.ResultType == XPathResultType.Error)
                    Console.WriteLine("\tError!");
            }

            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.           

            //MessageQueryTable<string> mq = MessageHelper.SetupTable();
            //foreach (KeyValuePair<MessageQuery, string> kv in mq)
            //{
            //    XPathMessageQuery xp = (XPathMessageQuery)kv.Key;
            //    Console.WriteLine("Value = {0}", kv.Value);
            //    Console.WriteLine("{0} = {1}", xp.Expression, xp.Evaluate<string>(mb));
            //}

            Console.ReadLine();
        }
    }

    public class MessageHelper
    {
        static string messageBody =
              "<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 static string xpath = "/s12:Envelope/s12:Body/PurchaseOrder/Items/Item[@quantity = 1]";
        public static string xpath2 = "/s12:Envelope/s12:Body/PurchaseOrder/Items/Item[@product = 'nail']";
        public static string xpath3 = "/s12:Envelope/s12:Body/PurchaseOrder/Comments";
        public static string xpath4 = "count(/s12:Envelope/s12:Body/PurchaseOrder/Items/Item)";
        public static string xpath5 = "substring(string(/s12:Envelope/s12:Body/PurchaseOrder/Number),5,4)";
        public static string xpath6 = "/s12:Envelope/s12:Body/PurchaseOrder/Department='OnlineSales'";
        public static string xpath7 = "//PurchaseOrder/@date";
        public static string xpath8 = "//SpecialOffer/ancestor::Item[@product = 'brad']";

        // Invoke the correlation data function.
        public static string xpath9 = "sm:correlation-data('CorrelationData1')";
        public static string xpath10 = "sm:correlation-data('CorrelationData2')";

        public static string xpath11 = "/s12:Envelope/s12:Body/PurchaseOrder/Items/Item[@quantity = 2]";

        public static Message CreateMessage()
        {
            StringReader stringReader = new StringReader(messageBody);
            XmlTextReader xmlReader = new XmlTextReader(stringReader);
            Message 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.
            CorrelationDataMessageProperty data = new CorrelationDataMessageProperty();

            data.Add("CorrelationData1", () => "value1");
            data.Add("CorrelationData2", () => "value2");
            message.Properties[CorrelationDataMessageProperty.Name] = data;

            return message;
        }

        public static XPathMessageQueryCollection SetupQueryCollection()
        {
            // Create the query collection and add the XPath queries to it. To create
            // the query, you must also use a new XPathMessageContext.

            XPathMessageQueryCollection queryCollection = new XPathMessageQueryCollection();

            XPathMessageContext context = 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;
        }

        public static MessageQueryTable<string> SetupTable()
        {
            // This is optional code to demonstrate using a MessageQueryTable.
            // Compare this to the MessageQueryCollection.
            MessageQueryTable<string> table = new MessageQueryTable<string>();
            XPathMessageContext context = 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;
        }
    }    
}
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

Hinweise

Die MessageQuery-Klasse ähnelt der MessageFilter-Klasse.The MessageQuery class is similar to the MessageFilter class. Statt Übereinstimmungen zurückzugeben, gibt die Evaluate-Methode die Ergebnisse einer Abfrage für eine Nachricht aus.However, instead of returning matches, the Evaluate method returns the results of evaluating a query against a message. Das Ergebnis der Abfrage ist ein Wert, der in der Nachricht enthalten ist.The result of the query is a value in the message. Verwenden Sie den Wert als Schlüssel, um die Nachricht in Beziehung zu anderen Nachrichten zu setzen.Use the value as a key to correlate the message to other messages. Um eine neue Eigenschaft für die Daten hinzuzufügen, verwenden Sie die Add-Methode der CorrelationDataMessageProperty-Klasse.To add a new property for the data, use the Add method of the CorrelationDataMessageProperty class.

Hinweis

Eine konkrete Implementierung der MessageQuery-Methode finden Sie in der XPathMessageQuery-Klasse.For a concrete implementation of the MessageQuery, see the XPathMessageQuery class.

Verwenden der XPathMessageQuery-Klasse und der MessageQueryCollection-KlasseUsing the XPathMessageQuery and MessageQueryCollection classes

Sie können den Abfrageprozess optimieren, indem Sie einen Satz von Abfrageobjekten erstellen und sie in eine Instanz der MessageQueryCollection-Klasse einfügen.You can optimize the query process by creating a set of query objects and inserting them into an instance of the MessageQueryCollection class.

Hinweis

Eine konkrete Implementierung der MessageQueryCollection-Methode finden Sie in der XPathMessageQueryCollection-Klasse.For a concrete implementation of the MessageQueryCollection, see the XPathMessageQueryCollection class.

Eine allgemeine Verwendung ist, die Auflistung mit Abfragen aufzufüllen, die über das gleiche XPath-Prädikat verfügen und sich nur im abschließenden Blattwert unterscheiden.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. Die folgenden XPath-Abfragen unterscheiden sich z. B. nur in der abschließenden Klausel.For example, the following XPath queries are identical except for the final clause. Die ersten Abfragen aller Elemente, bei denen das Mengenattribut auf 1 festgelegt ist, und die zweiten Abfragen aller Elemente, bei denen das Produktattribut haben auf 'Contoso' festgelegt ist: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']"  

Mit der MessageQueryCollection-Klasse können Sie Tabellen von Abfragen erstellen, die sich nur leicht unterscheiden, sodass sie effizienter verarbeitet werden.The MessageQueryCollection class allows you to create tables of queries that differ only slightly, enabling more efficient processing.

Alternativ können Sie die MessageQueryTable<TItem>-Klasse verwenden, um Nachrichtenabfragen zu speichern und auszuwerten.Alternatively, you can use the MessageQueryTable<TItem> class to store and evaluate message queries.

Konstruktoren

MessageQuery()

Initialisiert eine neue Instanz der MessageQuery-Klasse.Initializes a new instance of the MessageQuery class.

Methoden

CreateMessageQueryCollection()

Erstellt eine Auflistung von Abfragen, die einen bestimmten Typ von ihr zugeordneten Daten zurückgibt.Creates a collection of queries that returns a specific type of data associated with it.

Equals(Object)

Bestimmt, ob das angegebene Objekt gleich dem aktuellen Objekt ist.Determines whether the specified object is equal to the current object.

(Geerbt von Object)
Evaluate<TResult>(Message)

Wenn sie in einer abgeleiteten Klasse überschrieben wird, wird eine Abfrage für die Nachricht ausgeführt und ein Wert zurückgegeben.When overridden in a derived class, runs a query against the message and returns a result. Der Text kann nicht abgefragt werden.The body cannot be queried.

Evaluate<TResult>(MessageBuffer)

Wenn sie in einer abgeleiteten Klasse überschrieben wird, wird eine Abfrage für die Nachricht ausgeführt und ein Wert zurückgegeben.When overridden in a derived class, runs a query against the message and returns a result.

GetHashCode()

Dient als die Standard-HashfunktionServes as the default hash function.

(Geerbt von Object)
GetType()

Ruft den Type der aktuellen Instanz ab.Gets the Type of the current instance.

(Geerbt von Object)
MemberwiseClone()

Erstellt eine flache Kopie des aktuellen Object.Creates a shallow copy of the current Object.

(Geerbt von Object)
ToString()

Gibt eine Zeichenfolge zurück, die das aktuelle Objekt darstellt.Returns a string that represents the current object.

(Geerbt von Object)

Gilt für:

Siehe auch