契约:

    [ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples", SessionMode = SessionMode.Required,
CallbackContract = typeof(ITransferCallback))] 如果要使用回调,必须加上这句话
public interface IMonitorService
{
[OperationContract(IsOneWay = true)]
void MonitorOnlineService(string strJson);
}
       [ServiceContract(CallbackContract = typeof(IMonitorService))]
public interface ITransferCallback
{
[OperationContract(IsOneWay = true)]
void ReturnResult(string strJson);
}

server1

接口实现

  public class TransferCallback : ITransferCallback
{
public void ReturnResult(string strJson)
{
Console.WriteLine("start service");
Monitor.MonitorOnlineService(strJson);
} private IMonitorService Monitor {
get
{
return OperationContext.Current.GetCallbackChannel<IMonitorService>();
}
} }
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup> <system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="NewBehavior0">
<serviceMetadata httpGetEnabled="true" />
</behavior>
</serviceBehaviors>
</behaviors> <services>
<service name="WcfServer.TransferCallback">
<endpoint address="net.tcp://127.0.0.1:8000/TransferCallback"
binding="netTcpBinding" bindingConfiguration="" contract="WcfServer.ITransferCallback" />
<host>
<baseAddresses>
<add baseAddress="net.tcp://127.0.0.1:8000/TransferCallback" />
</baseAddresses>
</host>
</service>
</services> <bindings>
<basicHttpBinding>
<binding name="basicHttpBind" closeTimeout="00:10:00" openTimeout="00:05:00"
receiveTimeout="00:10:00" sendTimeout="00:05:00" allowCookies="false"
bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
maxBufferPoolSize="" maxBufferSize="" maxReceivedMessageSize=""
textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="true"
messageEncoding="Text">
<readerQuotas maxStringContentLength="" />
<security mode="None" />
</binding>
</basicHttpBinding>
<netTcpBinding>
<binding name="TransferNetTcpBind" closeTimeout="00:10:00" openTimeout="00:05:00" receiveTimeout="00:10:00" sendTimeout="00:05:00" maxBufferPoolSize="" maxReceivedMessageSize="" maxBufferSize="">
<readerQuotas maxStringContentLength=""/>
<security mode="None"></security>
</binding>
<binding name="NetTcpBinding_ITransferCallback" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions"
hostNameComparisonMode="StrongWildcard" listenBacklog=""
maxBufferPoolSize="" maxBufferSize="" maxConnections=""
maxReceivedMessageSize="">
<readerQuotas maxDepth="" maxStringContentLength="" maxArrayLength=""
maxBytesPerRead="" maxNameTableCharCount="" />
<reliableSession ordered="true" inactivityTimeout="00:10:00"
enabled="false" />
<security mode="Transport">
<transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" />
<message clientCredentialType="Windows" />
</security>
</binding>
</netTcpBinding>
</bindings> <client>
<endpoint address="net.tcp://127.0.0.1:9000/MonitorService"
binding="netTcpBinding" bindingConfiguration="NetTcpBinding_ITransferCallback"
contract="IMonitorService" name="NetTcpBinding_ITransferCallback">
</endpoint> </client>
</system.serviceModel> </configuration>

启用服务

 class Program
{
static void Main(string[] args)
{
using (ServiceHost host = new ServiceHost(typeof(DataTransferCallback)))
{
ServiceMetadataBehavior smb = host.Description.Behaviors.Find<ServiceMetadataBehavior>();
if (smb == null)
host.Description.Behaviors.Add(new ServiceMetadataBehavior()); //暴露出元数据,以便能够让SvcUtil.exe自动生成配置文件
host.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexTcpBinding(), "mex"); //开启服务
host.Open();
Console.WriteLine("Service listen begin to listen...");
Console.WriteLine("press any key to teriminate...");
Console.ReadKey();
host.Abort();
host.Close();
}
}
}

Wcfserver2

 public class MonitorService : IMonitorService
{
#region
/// <summary>
/// 写入集成控制平台数据
/// </summary>
/// <param name="strJson">JSON字符串</param>
/// <param name="strOrgCode">直属库编号</param>
/// <param name="strTableName">表明</param>
/// <returns></returns>
public void MonitorOnlineService(string strJson)
{Callback.ReturnResult(result);
} #endregion
ITransferCallback Callback
{
get
{
return OperationContext.Current.GetCallbackChannel<ITransferCallback>();
}
}
}
调用服务

new ChannelFactory<IDataTransferCallback>("NetTcpBinding_ITransferCallback").CreateChannel().ReturnResult("Hello");
<system.serviceModel>

                                                <client>
<endpoint address="net.tcp://127.0.0.1:8000/TransferCallback"
binding="netTcpBinding" bindingConfiguration="NetTcpBinding_ITransferCallback"
contract="ITransferCallback" name="NetTcpBinding_ITransferCallback">
</endpoint>
</client> <services>
<service name="MonitorService">
<host>
<baseAddresses>
<add baseAddress="net.tcp://127.0.0.1:9000/MonitorService" />
</baseAddresses>
</host>
<endpoint address="net.tcp://127.0.0.1:9000/MonitorService" binding="netTcpBinding" bindingConfiguration="TransferNetTcpBind"
contract="IMonitorService"/>
<endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange"/>
</service>
</services>
<bindings> <netTcpBinding>
<binding name="TransferNetTcpBind" closeTimeout="00:10:00" openTimeout="00:05:00" receiveTimeout="00:10:00" sendTimeout="00:05:00" maxBufferPoolSize="" maxReceivedMessageSize="" maxBufferSize="">
<readerQuotas maxStringContentLength=""/>
<security mode="None"></security>
</binding>
<binding name="NetTcpBinding_ITransferCallback" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions"
hostNameComparisonMode="StrongWildcard" listenBacklog=""
maxBufferPoolSize="" maxBufferSize="" maxConnections=""
maxReceivedMessageSize="">
<readerQuotas maxDepth="" maxStringContentLength="" maxArrayLength=""
maxBytesPerRead="" maxNameTableCharCount="" />
<reliableSession ordered="true" inactivityTimeout="00:10:00"
enabled="false" />
<security mode="Transport">
<transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" />
<message clientCredentialType="Windows" />
</security>
</binding>
</netTcpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="">
<serviceMetadata httpGetEnabled="False"/>
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>

这样服务就可以循环交互了,直到一个服务停止为止

Wcf使用Net.Tcp做回调操作的更多相关文章

  1. [WCF编程]10.操作:回调操作

    一.回调操作概述 WCF支持服务将调用返回给它的客户端.在回调期间,许多方面都将颠倒过来:服务将成为客户端,客户端将编程服务.回调操作可以用在各种场景和应用程序中,但在涉及事件或者服务发生时间需要通知 ...

  2. 重温WCF之数单向通讯、双向通讯、回调操作(五)

    一.单向通讯单向操作不等同于异步操作,单向操作只是在发出调用的瞬间阻塞客户端,但如果发出多个单向调用,WCF会将请求调用放入到服务器端的队列中,并在某个时间进行执行.队列的存储个数有限,一旦发出的调用 ...

  3. 跟我一起学WCF(9)——WCF回调操作的实现

    一.引言 在上一篇文章中介绍了WCF对Session的支持,在这篇文章中将详细介绍WCF支持的操作.在WCF中,除了支持经典的请求/应答模式外,还提供了对单向操作.双向回调操作模式的支持,此外还有流操 ...

  4. WCF分布式开发步步为赢(10):请求应答(Request-Reply)、单向操作(One-Way)、回调操作(Call Back).

    WCF除了支持经典的请求应答(Request-Reply)模式外,还提供了什么操作调用模式,他们有什么不同以及我们如何在开发中使用这些操作调用模式.今天本节文章里会详细介绍.WCF分布式开发步步为赢( ...

  5. WCF 采用net.tcp协议

    WCF 采用net.tcp协议实践   概述 与Socket相比,WCF真是爽得不得了,其基本指导思想为SOA——面向服务. 其基本配置在于ABC(Address,Binding,Contract), ...

  6. Restful风格API中用put还是post做新增操作有什么区别?

    Restful风格API中用put还是post做新增操作有什么区别? 转 头条面试归来,有些话想和Java开发者说!>>> 这个是华为面试官问我的问题,回来我找了很多资料,想验证这个 ...

  7. 关于有默认值的字段在用EF做插入操作时的思考(续)

    问题描述 今天下午(看现在这时间,应该是昨天下午了哈),园友 choon 写了这样一篇博文<关于有默认值的字段在用EF做插入操作时的思考>. 博文内容主要记录的是 choon 使用 EF ...

  8. 关于有默认值的字段在用EF做插入操作时的思考

    今天在用EF做插入操作的时候发现数据库中一个datetime类型的字段(CreateDate)的值居然全部为null.于是赶紧看表结构发现CreateDate字段居然是允许为空的. 虽然为空,但是设置 ...

  9. Entity Framework 的小实例:在项目中添加一个实体类,并做插入操作

    Entity Framework 的小实例:在项目中添加一个实体类,并做插入操作 1>. 创建一个控制台程序2>. 添加一个 ADO.NET实体数据模型,选择对应的数据库与表(Studen ...

随机推荐

  1. 放弃winform的窗体吧,改用html作界面,桌面应用程序UI的新的开发方式。

    做过很多winform项目,都为winform控件头疼不已.想实现一些漂亮的样子总是很难.我这里列举几个缺点: 1.winform控件大多是 绝对布局 ,你需要给出准确的坐标.那么在实现居中效果就会很 ...

  2. Laravel 定时任务

    一 .创建Command文件 php artisan make:console RefreshToken 创建app/Console/Commands 下创建RefreshToken.php 取一个名 ...

  3. 摄像头驱动OV7725学习笔记连载(二):0V7725 SCCB时序的实现之寄存器配置

    上一篇博客主要介绍了OV7725的电气特性以及SCCB接口的时序和输出一帧图像的时序图以及数据的拼接.输出一帧图像与输出时钟PCLK有关. 上图是OV7725实现的整体框架,有点丑.FPGA描述SCC ...

  4. Mayi_XPath编写规则学习

    XPath编写规则学习   辅助工具:firefox安装findbugs,view Xpath firefox :Xpath验证方式:$x("xpath"); 粘贴xpath语句回 ...

  5. 【转】【项目管理与构建】Maven

    在现实的企业中,以低成本.高效率.高质量的完成项目,不仅仅需要技术大牛,企业更加需要管理大牛,管理者只懂技术是远远不够的.当然,管理可以说有很多的方面,例如:对人员的管理,也有对项目的管理等等.如果你 ...

  6. shell编程小结

    因为项目中要用到shell脚本,所以系统的看了一下.以前只是泛泛的了解. 变量:环境变量.预定义变量.位置变量.自定义变量. 环境变量这个好说,通过set或者env命令都能看到相应的列表,然后可以通过 ...

  7. 建议大家使用Java 8 的日期、时间,而非java.util.Date

    建议大家使用Java 8 的日期.时间,而非java.util.Date. 详细原因见:如何在Java 8中愉快地处理日期和时间 总结一下就是, java.util.Date 太乱,如 月份从0开始. ...

  8. Mybatis系列(三):Mybatis实现关联表查询

    原文链接:http://www.cnblogs.com/xdp-gacl/p/4264440.html 一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 ...

  9. JDBC删除数据实例

    在本教程将演示如何在JDBC应用程序中,删除数据库表中数据记录. 在执行以下示例之前,请确保您已经准备好以下操作: 具有数据库管理员权限,以在给定模式的数据库表中删除数据记录. 要执行以下示例,需要用 ...

  10. e821. 设置JScrollPane滚动栏

    A scroll bar in a scroll pane can be set to appear only as needed, always appear, or never appear. B ...