Wcf 新功能--WebSocket、UDP
1.WebSocket通信
websocket 和 http的关系(交集)
要点
- 长链接
- 使用NetHttpBinding
- 基于双工
协议栈
Http + Binary 模式传输

Host
public class HomeService : IHomeService { public static Dictionary<string, ICallback> dic = new Dictionary<string, ICallback>(); public string Do(string ms) { var callback = OperationContext.Current.GetCallbackChannel<ICallback>(); dic[ms] = callback; Console.WriteLine("当前{0}已登录", ms); return string.Format("datatime:{0},data:{1}", ms, DateTime.Now); } public static void DoModify() { while (true) { var input = Console.ReadLine(); if (!string.IsNullOrEmpty(input)) { foreach (var item in dic) { item.Value.Notify(input); } } } } } [ServiceContract(CallbackContract = typeof(ICallback))] public interface IHomeService { [OperationContract] string Do(string ms); } [ServiceContract] public interface ICallback { [OperationContract(IsOneWay =true)] void Notify(string msg); }
static void Main(string[] args) { using (ServiceHost host = new ServiceHost(typeof(HomeService))) { host.Opened += Host_Opened; host.Open(); Task.Run(() => { HomeService.DoModify(); }); Console.ReadKey(); System.Threading.Thread.Sleep(int.MaxValue); } } private static void Host_Opened(object sender, EventArgs e) { Console.WriteLine("opened"); }
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceDebug includeExceptionDetailInFaults="true"/>
<serviceMetadata httpGetEnabled="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service name="Host06.HomeService">
<endpoint address="homeservice"
binding="netHttpBinding" bindingConfiguration="myNetHttpBinding"
contract="Host06.IHomeService">
</endpoint>
<host>
<baseAddresses>
<add baseAddress="http://192.168.48.128:8080"/>
</baseAddresses>
</host>
</service>
</services>
<bindings>
<netHttpBinding>
<binding name="myNetHttpBinding">
<!--指定何时使用 Web Socket
WhenDuplex 如果为双工协定,则使用 Web Socket 协议。
Always 始终使用 Web Socket 协议,而不管协定类型。
Never 永远不使用 Web Socket 协议。-->
<webSocketSettings transportUsage="WhenDuplex"/>
<security mode="None"/>
</binding>
</netHttpBinding>
</bindings>
</system.serviceModel>
client
class Program { static void Main(string[] args) { var instance = new InstanceContext(new MyCallback()); ServiceReference1.HomeServiceClient client = new ServiceReference1.HomeServiceClient(instance); var result = client.Do("hello"); Console.WriteLine(result); Console.ReadKey(); } } public class MyCallback : ServiceReference1.IHomeServiceCallback { public void Notify(string msg) { Console.WriteLine(msg); } }
fiddler抓包结果

2.UDP通信
<system.serviceModel>
<client />
<behaviors>
<serviceBehaviors>
<behavior name="myServiceBehavior">
<serviceDebug includeExceptionDetailInFaults="true"/>
<serviceMetadata httpGetEnabled="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service name="Host07.HomeService" behaviorConfiguration="myServiceBehavior">
<endpoint address="soap.udp://192.168.48.128:8081/"
binding="udpBinding"
contract="Host07.IHomeService">
</endpoint>
<host>
<baseAddresses>
<add baseAddress="http://192.168.48.128:8080"/>
</baseAddresses>
</host>
</service>
</services>
<bindings />
</system.serviceModel>
要点
- EndPoint Address :soap.udp://192.168.48.128:8081/
- Binding:udpBinding
协议栈
UDP + binary 模式传输

浙公网安备 33010602011771号