WCF wsHttpBinding 內建支援 WS-ReliableMessaging 協定,透過 reliableSession 設定啟用訊息重試、重複偵測與有序傳遞,確保不可靠網路下的訊息完整送達。
ordered="true" 時,服務端緩衝區依客戶端呼叫順序排序處理[ServiceContract]
[DeliveryRequirements(RequireOrderedDelivery = true)]
public interface IReliable {
[OperationContract(IsOneWay = true)]
void Write(string str);
}
public class Reliable : IReliable {
public void Write(string str) {
using (var sw = new StreamWriter(@"C:\WCF_Log_Reliable.txt", true)) {
sw.WriteLine(str);
}
}
}
<bindings>
<wsHttpBinding>
<binding name="ReliableBindingConfiguration">
<reliableSession enabled="true" ordered="true" inactivityTimeout="00:10:00" />
<security mode="None" /> <!-- 示範用關閉安全性 -->
</binding>
</wsHttpBinding>
</bindings>
<services>
<service name="WCF.ServiceLib.Message.Reliable" behaviorConfiguration="MessageBehavior">
<endpoint address="https://localhost:8888/ServiceHost/Message/Reliable.svc"
listenUri="https://localhost:3502/ServiceHost/Message/Reliable.svc"
binding="wsHttpBinding" contract="WCF.ServiceLib.Message.IReliable"
bindingConfiguration="ReliableBindingConfiguration" />
</service>
</services>
listenUri 指定實際監聽位址,address 為客戶端連接位址(可搭配 TCP Trace 等工具攔截觀察)。
<client>
<endpoint address="https://localhost:8888/ServiceHost/Message/Reliable.svc"
binding="wsHttpBinding" contract="MessageSvc.Reliable.IReliable"
bindingConfiguration="ReliableBindingConfiguration" />
</client>
using (var proxy = new MessageSvc.Reliable.ReliableClient()) {
proxy.Write("1");
Thread.Sleep(3000);
proxy.Write("2");
}
Write("1")Write("2") 仍會成功送達,且順序正確| 屬性 | 說明 |
|---|---|
| enabled | 啟用 WS-ReliableMessaging |
| ordered | 強制有序傳遞,需搭配 DeliveryRequirements(RequireOrderedDelivery=true) |
| inactivityTimeout | 非活動逾時關閉會話,預設 10 分鐘 |
| maxRetryCount | 最大重試次數(進階設定,非直接屬性) |
啟用可靠會話會增加通訊交握開銷,建議僅在必要時開啟,並搭配適當的 inactivityTimeout 避免閒置會話佔用資源。