WCF双向通讯netTCP
一、服务端配置
<?xml version="1.0" encoding="utf-8" ?> <configuration> <system.serviceModel> <behaviors> <serviceBehaviors> <behavior name="MyBehavior"> <serviceMetadata httpGetEnabled="true" /> <serviceDebug includeExceptionDetailInFaults="false" /> </behavior> </serviceBehaviors> <endpointBehaviors> <behavior name="webBehavior"> <webHttp /> </behavior> </endpointBehaviors> </behaviors> <services> <service name="PayCommunicationWcf.Server.AliPay" > <endpoint address="" binding="netTcpBinding" contract="PayCommunicationWcf.Interface.IPay"> <identity> <!-- <dns value="localhost" />--> </identity> </endpoint> <!-- <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> --> <host> <baseAddresses> <add baseAddress="net.tcp://localhost:57000/sessionservice" /> </baseAddresses> </host> </service> </services> <bindings> <webHttpBinding> <binding name="ApiExportBinding" maxReceivedMessageSize="10485760" maxBufferPoolSize="10485760" maxBufferSize="10485760" closeTimeout="00:03:00" openTimeout="00:03:00" receiveTimeout="00:10:00" sendTimeout="00:03:00"> <readerQuotas maxDepth="32" maxStringContentLength="10485760" maxArrayLength="10485760" maxBytesPerRead="10485760" /> <security mode="None" /> </binding> </webHttpBinding> </bindings> </system.serviceModel> </configuration>
二、服务端服务契约和服务实现
1、服务实现
using System; using PayCommunicationWcf.Interface; using PayCommunicationWcf.Model; using PurClient.Logging; namespace PayCommunicationWcf.Server { public class PayCallBack : IPayCallBack { public void SendResultOfPay(PayResultResponse result) { Logger.GetInstance().Info(string.Format("已经接收到服务端发来的支付结果消息,结果码:{0},结果信息:{1}。",result.Resultcode, result.Msg)); } } }
2、服务契约
服务契约
using System.ServiceModel; using System.ServiceModel.Web; using PayCommunicationWcf.Model; namespace PayCommunicationWcf.Interface { [ServiceContract(CallbackContract = typeof(IPayCallBack))] public interface IPay { /* [WebInvoke(UriTemplate = "PayRequestTest", BodyStyle = WebMessageBodyStyle.Bare,Method = "*",RequestFormat =WebMessageFormat.Json,ResponseFormat = WebMessageFormat.Json)] */ [OperationContract] PayResultResponse PayRequestTest(PayRequestInfo payData); /* [WebInvoke(UriTemplate = "PayRequest?payData={payData}", BodyStyle = WebMessageBodyStyle.Bare, Method = "*", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)] */ [OperationContract] string PayRequest(string payData); } }
回调服务契约,在客户端中实现
using System.ServiceModel; using PayCommunicationWcf.Model; namespace PayCommunicationWcf.Interface { [ServiceContract] public interface IPayCallBack { [OperationContract(IsOneWay = true)] void SendResultOfPay(PayResultResponse result); } }
3、服务注册
using System.ServiceModel; namespace PayCommunicationWcf.Server { public static class ServiceRegister { /// <summary> /// 通过反射注册服务 /// </summary> public static void RegisterAllService() { ServiceHost host = new ServiceHost(typeof(AliPay)); if (host.State != CommunicationState.Opening) host.Open(); } } }
三 、客户端配置
<?xml version="1.0" encoding="utf-8" ?> <configuration> <system.serviceModel> <client> <endpoint address="net.tcp://182.150.28.182:57000/sessionservice" binding="netTcpBinding" bindingConfiguration="" contract="PayCommunicationWcf.Interface.IPay" name="sessionservice" /> </client> <bindings> <netTcpBinding> <binding> <security mode="None"> </security> </binding> </netTcpBinding> </bindings> </system.serviceModel> </configuration>
四、客户端实现
1、回调契约实现
using System; using PayCommunicationWcf.Interface; using PayCommunicationWcf.Model; using PurClient.Logging; namespace PayCommunicationWcf.Server { public class PayCallBack : IPayCallBack { public void SendResultOfPay(PayResultResponse result) { Logger.GetInstance().Info(string.Format("已经接收到服务端发来的支付结果消息,结果码:{0},结果信息:{1}。",result.Resultcode, result.Msg)); } } }
2、客户端创建
private static IPay Channel { get; set; } private static IPayCallBack Callback { get; set; } private void FormMain_Load(object sender, EventArgs e) { var logger = Logger.GetInstance(); ; logger.DelShowUiLogEvent += Loger_DelShowUiLogEvent; Callback = new PayCallBack(); Channel = new DuplexChannelFactory<IPay>(Callback, "sessionservice").CreateChannel(); // ServiceRegister.RegisterAllService(); logger.Info("初始化完成。"); }
五、整解决方案源码