以簡單訂單處理服務為例,示範面向服務核心概念在 WCF 中的落地:契約定義、訊息結構、接收端實作與主機啟動、傳送端通道建立與訊息發送。
訂單資料結構:
<Order>
<ProdID>xs:integer</ProdID>
<Qty>xs:integer</Qty>
<Status>xs:string</Status>
</Order>
遵循 WS-Addressing 的 SOAP 訊息範例:
<s:Envelope ...>
<s:Header>
<wsa:Action>urn:SubmitOrder</wsa:Action>
<wsa:MessageID>4</wsa:MessageID>
<wsa:ReplyTo>.../anonymous</wsa:ReplyTo>
<wsa:To>https://localhost:8000/Order</wsa:To>
</s:Header>
<s:Body><Order>...</Order></s:Body>
</s:Envelope>
C# 契約介面(WCF 透過屬性映射至 WSDL/XSD):
[ServiceContract(Namespace = "https://wintellect.com/ProcessOrder")]
public interface IProcessOrder {
[OperationContract(Action = "urn:SubmitOrder")]
void SubmitOrder(Message order);
}
關鍵點:Message 型別參數代表任意傳入訊息;契約組件編譯後共享給傳送/接收雙方,確定後視為不可變。
public sealed class MyService : IProcessOrder {
public void SubmitOrder(Message order) {
string fileName = "Order" + order.Headers.MessageId + ".xml";
Console.WriteLine("Message ID {0} received", order.Headers.MessageId);
using (XmlDictionaryWriter writer = XmlDictionaryWriter.CreateTextWriter(
new FileStream(fileName, FileMode.Create))) {
order.WriteMessage(writer);
}
}
}
主機程式(ABC:Address、Binding、Contract):
WSHttpBinding binding = new WSHttpBinding(SecurityMode.None);
binding.MessageEncoding = WSMessageEncoding.Text;
Uri address = new Uri("https://localhost:4000/Order");
ServiceHost host = new ServiceHost(typeof(MyService));
host.AddServiceEndpoint(typeof(IProcessOrder), binding, address);
host.Open();
Console.WriteLine("The receiver is ready");
Console.ReadLine();
host.Close();
EndpointAddress address = new EndpointAddress("https://localhost:4000/Order");
WSHttpBinding binding = new WSHttpBinding(SecurityMode.None);
binding.MessageEncoding = WSMessageEncoding.Text;
ChannelFactory<IProcessOrder> factory = new ChannelFactory<IProcessOrder>(binding, address);
IProcessOrder proxy = factory.CreateChannel();
for (int i = 0; i < 10; i++) {
Message msg = GenerateMessage(i, i);
msg.Headers.MessageId = new UniqueId(i.ToString());
msg.Headers.Action = "urn:SubmitOrder";
proxy.SubmitOrder(msg);
}
訊息生成輔助方法使用 XmlDictionaryWriter 建立 Body,Message.CreateMessage 封裝 SOAP 1.2 + WS-Addressing 訊息。
接收端主控台顯示 10 筆訊息接收紀錄,產出的 XML 檔案含完整 SOAP 標頭,驗證 WCF 物件模型成功映射至標準 SOAP 訊息。