首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

《WCF 技術內幕》譯文 12:面向服務核心概念實作演示 — 契約、訊息、主機、通道

     編輯:關於.NET

以簡單訂單處理服務為例,示範面向服務核心概念在 WCF 中的落地:契約定義、訊息結構、接收端實作與主機啟動、傳送端通道建立與訊息發送。

1. 契約定義:從 Schema 到 C# 介面

訂單資料結構:

<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 型別參數代表任意傳入訊息;契約組件編譯後共享給傳送/接收雙方,確定後視為不可變。

2. 接收端實作與主機啟動

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();

3. 傳送端:ChannelFactory 建立 Proxy 發送訊息


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 訊息。

4. 執行結果驗證

接收端主控台顯示 10 筆訊息接收紀錄,產出的 XML 檔案含完整 SOAP 標頭,驗證 WCF 物件模型成功映射至標準 SOAP 訊息。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved