MessageQueryTable<TItem> 類別
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
管理訊息查詢物件的集合。
generic <typename TItem>
public ref class MessageQueryTable : System::Collections::Generic::ICollection<System::Collections::Generic::KeyValuePair<System::ServiceModel::Dispatcher::MessageQuery ^, TItem>>, System::Collections::Generic::IDictionary<System::ServiceModel::Dispatcher::MessageQuery ^, TItem>, System::Collections::Generic::IEnumerable<System::Collections::Generic::KeyValuePair<System::ServiceModel::Dispatcher::MessageQuery ^, TItem>>
public class MessageQueryTable<TItem> : System.Collections.Generic.ICollection<System.Collections.Generic.KeyValuePair<System.ServiceModel.Dispatcher.MessageQuery,TItem>>, System.Collections.Generic.IDictionary<System.ServiceModel.Dispatcher.MessageQuery,TItem>, System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<System.ServiceModel.Dispatcher.MessageQuery,TItem>>
type MessageQueryTable<'Item> = class
interface IDictionary<MessageQuery, 'Item>
interface ICollection<KeyValuePair<MessageQuery, 'Item>>
interface seq<KeyValuePair<MessageQuery, 'Item>>
interface IEnumerable
Public Class MessageQueryTable(Of TItem)
Implements ICollection(Of KeyValuePair(Of MessageQuery, TItem)), IDictionary(Of MessageQuery, TItem), IEnumerable(Of KeyValuePair(Of MessageQuery, TItem))
類型參數
- TItem
查詢所傳回值的型別。
- 繼承
-
MessageQueryTable<TItem>
- 實作
-
ICollection<KeyValuePair<MessageQuery,TItem>> ICollection<KeyValuePair<TKey,TValue>> IDictionary<MessageQuery,TItem> IEnumerable<KeyValuePair<MessageQuery,TItem>> IEnumerable<KeyValuePair<TKey,TValue>> IEnumerable<T> IEnumerable
範例
下列範例會建立訊息和 XPath 訊息查詢。 查詢會由包含在 XPathMessageQuery 物件內的 XPathMessageQueryCollection 物件評估。 每一個查詢的結果都會使用 ResultType 類別的 XPathResult 屬性測試。 取消替代程式碼的註解,查看使用 MessageQueryTable<TItem> 示範的類似功能。
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
建構函式
MessageQueryTable<TItem>() |
初始化 MessageQueryTable<TItem> 類別的新執行個體。 |
屬性
Count |
取得資料表中查詢/資料組的數目。 |
IsReadOnly |
取得值,這個值表示資料表是否為唯讀。 |
Item[MessageQuery] |
取得或設定與資料型別相關聯的查詢物件。 |
Keys |
傳回資料表中包含的所有集合索引鍵的集合。 |
Values |
取得資料表中所包含結果值的集合。 |
方法
Add(KeyValuePair<MessageQuery,TItem>) |
加入定義為索引鍵/值組的項目。 |
Add(MessageQuery, TItem) |
使用索引鍵/值系統將項目加入至集合。 |
Clear() |
從集合中移除所有成員。 |
Contains(KeyValuePair<MessageQuery,TItem>) |
判斷集合中是否包含具有索引鍵/值格式的特定項目。 |
ContainsKey(MessageQuery) |
判斷集合是否包含具有指定之索引鍵的項目。 |
CopyTo(KeyValuePair<MessageQuery,TItem>[], Int32) |
從指定的索引開始,將集合的項目複製到 Array。 |
Equals(Object) |
判斷指定的物件是否等於目前的物件。 (繼承來源 Object) |
Evaluate<TResult>(Message) |
針對訊息執行查詢,並傳回結果的集合。 本文無法進行查詢。 |
Evaluate<TResult>(MessageBuffer) |
針對訊息執行查詢,並傳回結果。 |
GetEnumerator() |
傳回逐一查看集合的列舉值。 |
GetHashCode() |
做為預設雜湊函式。 (繼承來源 Object) |
GetType() |
取得目前執行個體的 Type。 (繼承來源 Object) |
MemberwiseClone() |
建立目前 Object 的淺層複製。 (繼承來源 Object) |
Remove(KeyValuePair<MessageQuery,TItem>) |
從集合中移除指定物件的第一個符合項目。 |
Remove(MessageQuery) |
從集合中移除與指定索引鍵相關聯的項目。 |
ToString() |
傳回代表目前物件的字串。 (繼承來源 Object) |
TryGetValue(MessageQuery, TItem) |
檢查比對查詢是否儲存在資料表中。 |
明確介面實作
IEnumerable.GetEnumerator() |
傳回列舉值,可用來逐一查看集合。 |
擴充方法
適用於
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應