IIS 7 引入 WAS (Windows Process Activation Service),配合 WCF 提供的 TCP/Named Pipe/MSMQ Listener + Adapter,IIS 可像寄宿 HTTP 服務一樣寄宿非 HTTP 協定的 WCF 服務。本文以 NetTcpBinding 為例,完整演示從站點綁定、應用啟用協定到客戶端調用的全流程。
[ServiceContract(Namespace="https://www.artech.com/")]
public interface ICalculator { [OperationContract] double Add(double x, double y); }
public class CalculatorService : ICalculator
{
public double Add(double x, double y) => x + y;
}
<%@ ServiceHost Service="Artech.WasHostingDemo.Services.CalculatorService, Artech.WasHostingDemo.Services" %>
<system.serviceModel>
<services>
<service name="Artech.WasHostingDemo.Services.CalculatorService">
<endpoint address="" binding="netTcpBinding" contract="Artech.WasHostingDemo.Contracts.ICalculator" />
</service>
</services>
</system.serviceModel>
注意:專案輸出目錄設為 Bin,供 ASP.NET 動態編譯載入。
appcmd.exe set site "Default Web Site" -+bindings.[protocol='net.tcp',bindingInformation='808:*']
或 IIS 管理器 → 「繫結」 → 新增:類型 net.tcp、連接埠 808。
appcmd.exe set app "Default Web Site/WasHostingDemo" /enabledProtocols:http,net.tcp
關鍵:預設應用僅啟用 http,必須額外加入 net.tcp。
<endpoint address="net.tcp://127.0.0.1/WasHostingDemo/CalculatorService.svc"
binding="netTcpBinding" contract="ICalculator" name="calculatorservice" />
// 代碼
using (var factory = new ChannelFactory<ICalculator>("calculatorservice"))
{
var proxy = factory.CreateChannel();
Console.WriteLine($"1+2={proxy.Add(1,2)}");
(proxy as ICommunicationObject).Close();
}
NetTcpActivator Windows Service 已啟動。WAS + WCF Listener/Adapter 架構,讓 IIS 成為真正的通用應用程式伺服器,支援 TCP、Named Pipe、MSMQ 等高效能協定,且享有 IIS 的進程管理、回收、監控等企業級特性。